r - 聚合一列字符串值
问题描述
我正在尝试按两列(机构名称和年份)对数据框进行分组,以创建一个新的数据框,其中包含我的数字变量和字符串变量的总和。但是,当我在 dplyr 中使用 group 命令时,我的所有字符串变量都会被删除。
我有一个包含交通补助数据的数据框。变量包括赠款资金、指示是否授予赠款的虚拟变量、申请的机构、年份和机构所在的州。每个机构都位于一个独特的州。我想按机构和年份对数据进行分组(因为一些机构在同一年提交了多个申请)并创建一个新的数据框,其中包含机构、赠款资金总额、授予赠款总额、年份、和国家。
我尝试了以下代码:
library(tidyverse)
Applicant_Name <- Applications %>%
group_by(ApplicantName, Year) %>%
select(everything()) %>%
summarise_if(is.numeric, sum, na.rm=TRUE)
但是,当我运行此代码时,状态变量会从数据框中删除。我还考虑过通过聚合命令使用字符串变量创建另一个数据框。然后将此数据框与申请人姓名数据框合并。我使用了以下代码:
test2 <- aggregate(test$State, by = list(test$ApplicantName, test$Year), paste(),
collapse = " ")
但是,此代码会创建一个州列,其中州名称在每个单元格中列出的次数与申请人名称在测试数据框中出现的次数一样多。
解决方案
我已尽我最大努力解释了您的数据描述,并提出以下内容:
dt = data.table(
grant = sample(seq(10000, 500000, by = 10000), 200, T),
agency = sample(LETTERS[1:3], 200, T),
awarded = sample(c(T,F), 200, T),
year = sample(1990:2010, 200, T),
state = sample(letters[1:10], 200, T)
)
> head(dt)
grant agency awarded year state
1: 100000 A FALSE 2007 j
2: 190000 C TRUE 2006 b
3: 390000 C FALSE 1992 h
4: 450000 B FALSE 2002 d
5: 70000 B FALSE 1996 d
6: 130000 B FALSE 2000 g
以下代码为每个机构-州-年组生成 (i) 申请的赠款和 (ii) 授予的赠款的总和。
mat = dt[, .(SumApplied = sum(grant), SumAward = sum(awarded*grant)), keyby = .(agency, year, state)]
> mat
agency year state SumApplied SumAward
1: A 1990 f 1160000 660000
2: A 1990 g 360000 360000
3: A 1990 j 330000 0
4: A 1991 a 800000 800000
5: A 1991 d 1120000 0
---
169: C 2009 c 140000 140000
170: C 2010 a 490000 0
171: C 2010 b 330000 0
172: C 2010 f 40000 40000
173: C 2010 h 360000 0
我希望它有帮助!
推荐阅读
- bash - 如何使 bash 脚本在控制台和没有它的情况下表现相同
- python - 如何将 API 查询的响应(JSON {"key":value} 格式)解析为变量列表,以便可以将其输入到 SQL 表中?
- mysql - 如何解决访问问题?
- mapbox - 如何使用 MapBox GeolocateControl 获取用户当前位置的 X 和 Y
- sql - 当特定的列组合确定其重复性时,如何排除sql中的数据?
- python - pandas:construct dataframe with > 1 ndim Categorical
- c++ - GMOCKing 接口时 std::any 的不完整类型
- hadoop - 如何提高 RecordWriter 的写入性能
- python - 在dile目录中选择文件后,使用文件名更新标签
- r - 分布在R中的多列