汇总一列字符串值

时间:2019-08-28 20:52:47

标签: r string dplyr aggregate

我试图按两列(代理商名称和年份)对数据框进行分组,以创建一个包含我的数字变量和字符串变量之和的新数据框。但是,当我在dplyr中使用group命令时,所有的字符串变量都将被删除。

我有一个数据框,其中包含有关交通补助的数据。变量包括赠款资金,指示是否授予赠款的虚拟对象,应用的代理机构,年份以及该代理机构所在的州。每个代理机构都位于唯一的状态。我想按代理商和年份对数据进行分组(因为某些代理商在同一年提交了多个申请),并创建了一个新的数据框,其中包含代理商,赠款总金额,赠款总金额,年份,和国家。

我尝试了以下代码:

library(tidyverse)

Applicant_Name <- Applications %>%
  group_by(ApplicantName, Year) %>%
  select(everything()) %>%
 summarise_if(is.numeric, sum, na.rm=TRUE)

但是,当我运行此代码时,状态变量将从数据帧中删除。我还考虑过通过聚合命令使用字符串变量创建另一个数据框。然后将该数据框与Applicant_Name数据框合并。我使用了以下代码:

test2 <- aggregate(test$State, by = list(test$ApplicantName, test$Year), paste(), 
                   collapse = " ") 

但是,此代码创建了一个“状态”列,其中在每个单元格中列出的州名称与在测试数据框中出现的申请人名称的次数相同。

1 个答案:

答案 0 :(得分:0)

我们尽力解释了您的数据描述,并提出以下建议:

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

希望对您有帮助!