我有一个包含三列的数据集
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")]
答案 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
操作,通常很麻烦。