首页 > 解决方案 > 聚合一列字符串值

问题描述

我正在尝试按两列(机构名称和年份)对数据框进行分组,以创建一个新的数据框,其中包含我的数字变量和字符串变量的总和。但是,当我在 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 = " ") 

但是,此代码会创建一个州列,其中州名称在每个单元格中列出的次数与申请人名称在测试数据框中出现的次数一样多。

标签: rstringdplyraggregate

解决方案


我已尽我最大努力解释了您的数据描述,并提出以下内容:

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

我希望它有帮助!


推荐阅读