改变ddply的输出

时间:2012-09-19 12:57:34

标签: r data.table plyr

是否可以改变ddply的输出?我想知道是否有可能在一行上呈现子集的唯一结果,而不是给每个结果一个新行。例如。

ID   Season  Year
5074 Summer 2008
5074 Summer 2009
5074 Winter 2008
5074 Winter 2009
5074 Winter 2010

INTO ...

ID   Season  Year  
5074 Summer  2008,2009  
5074 Winter  2008,2009,2010  

我经常使用ddply来手动诊断for循环的结果等,并且像这样显示结果会减少输出的长度并使检查更快。

干杯!

3 个答案:

答案 0 :(得分:7)

首先加载数据

dd = read.table(textConnection("ID   Season  Year
5074 Summer 2008
5074 Summer 2009
5074 Winter 2008
5074 Winter 2009
5074 Winter 2010"), header=TRUE)

然后正常使用ddply,按IDSeason进行拆分

ddply(dd, .(ID, Season), summarise, Year=paste(Year, collapse=","))

我们使用collapse中的paste参数返回单个字符。由于您希望将其用作支票,因此在sort上使用Year可能值得,即

paste(sort(Year), collapse=",")

答案 1 :(得分:3)

dat <- read.table(text="ID Season Year
 5074 Summer 2008
 5074 Summer 2009
 5074 Winter 2008
 5074 Winter 2009
 5074 Winter 2010", header = TRUE)

可以使用aggregate转换输出:

aggregate(Year ~ ID + Season, data = dat, paste)
#    ID Season             Year
#1 5074 Summer       2008, 2009
#2 5074 Winter 2008, 2009, 2010

答案 2 :(得分:2)

这非常适合data.table版本1.8.2中的列表的新漂亮打印

library(data.table)
DT <- as.data.table(dd)
DT[,list(Year = list(Year)), by = list(ID, Season)]
##     ID Season           Year
## 1: 5074 Summer      2008,2009
## 2: 5074 Winter 2008,2009,2010

这种格式的结果的好处在于它只是受影响的打印,你仍然可以访问结果而不需要任何字符串分割

DT[(ID==5074)&(Season == 'Summer'), Year]
## [1] 2008 2009
DT[(ID==5074)&(Season == 'Winter'), Year]
## [1] 2008 2009 2010