我希望使用dplyr中的c()函数来聚合一些字符串。我首先尝试了以下方法:
> InsectSprays$spray = as.character(InsectSprays$spray)
> dt = tbl_df(InsectSprays)
> dt %>% group_by(count) %>% summarize(c(spray))
Error: expecting a single value
但是在aggregate()中使用c()函数可以工作:
> da = aggregate(spray ~ count, InsectSprays, c)
> head(da)
count spray
1 0 C, C
2 1 C, C, C, C, E, E
3 2 C, C, D, E>
在stackoverflow中搜索提示说,使用paste()和collapse代替c()函数可以解决问题:
dt %>% group_by(count) %>% summarize(s=paste(spray, collapse=","))
或者
dt %>% group_by(count) %>% summarize(paste( c(spray), collapse=","))
我的问题是:为什么在aggregate()中c()函数能够工作,但在dplyr的summarize()中却不能?
toString()
,它与paste(.. , collapse = ", ")
相同。 - talatc()
返回一个向量,而paste(.. , collapse = ", ")
和toString
返回一个单独的字符串。(这并不真正回答你的问题,我知道)。要看到这一点,请比较str(aggregate(cyl ~ hp, mtcars, toString))
和str(aggregate(cyl ~ hp, mtcars, c))
之间的差异。 - talatlist
列,处理更大的数据集,可以使用data.table
。例如:DT1 <- data.table(InsectSprays);DT1[, list(spray=list(spray)), keyby=count]
。 - akrunaggregate
的输出中看不出来)? - talat