汇总两列R.

时间:2015-05-21 20:14:39

标签: r aggregate

我有一个包含三列的数据集

  Date1      StudentId  Status
  08/04/2014 155261     Yes
  08/04/2014 155261     No
  08/25/2014 236991     Yes
  08/27/2014 236991     Yes
  08/29/2014 236991     Yes

我正在尝试按Id和Date1聚合状态,这样最终的数据集将是这样的

  Date1      StudentId  Response
  08/04/2014 155261     Yes, No
  08/25/2014 236991     Yes
  08/27/2014 236991     Yes
  08/29/2014 236991     Yes

我尝试使用gsub功能,但它没有用,只是基于StudentId聚合并跳过日期,非常感谢对此问题的任何帮助。

 dataset1[,Response:=gsub("(, )+$","",c(paste(Status,collapse=", "),rep("",.N-1))),by=c("StudentId ","Date1")]

2 个答案:

答案 0 :(得分:3)

df <- data.frame(Date1=c('08/04/2014','08/04/2014','08/25/2014','08/27/2014','08/29/2014'), StudentId=c(155261,155261,236991,236991,236991), Status=c('Yes','No','Yes','Yes','Yes') );
aggregate(Status~Date1+StudentId,df,paste,collapse=', ');
##        Date1 StudentId  Status
## 1 08/04/2014    155261 Yes, No
## 2 08/25/2014    236991     Yes
## 3 08/27/2014    236991     Yes
## 4 08/29/2014    236991     Yes

您可以将列从Status重命名为Response

names(df)[names(df)=='Status'] <- 'Response';

答案 1 :(得分:3)

连接字符串不需要gsub(感谢@DavidArenburg进行简化):

DT1 <- DT[,list(Response=toString(Status)),by=list(Date1,StudentId)]

如果学生可能多次出现相同的状态,则您需要在unique上使用Status

您可以将值存储在包含list(String)的列表中,而不是使用字符串。

  • 好的:可以使用像%in%这样的设置操作,可能比字符串解析更直观。
  • 错误的:列表列不能用于by操作,通常很麻烦。