为什么dcast不可能通过非聚合函数?

时间:2016-07-29 02:10:42

标签: r data.table dcast

我正在使用data.table包来表示这样的表:

DT <- data.table(id=rep(1:100, each=50),
                 grp=rep(letters[1:4], each=1250),
                 time=rep(1:50,100),
                 outcome=rnorm(5000),
                 seconds=rep(1:500,10),
                 weights=rnorm(5000),
                 response=rep(1:200, each=25),
                 key=c("grp", "time"))

我想从此表创建一个新的(可能是rbindlisted)数据表,其中包含一些摘要统计信息。我首先创建了两个中间表a和b,

a <- DT[, list(mean = weighted.mean(outcome, weights), 
               median=median(outcome),seconds), by=c("grp","time")]
b <- DT[, list(mean=weighted.mean(response, seconds),
               median=median(response)), by=c("grp","time")]

然后我尝试在所有组中将这些行绑定在一起,但仍然沿着行保留分组。这不起作用:

  DTfinal <- data.table(DT$grp, DT$time,
   outcomemean=a$mean, responsemean=b$mean, 
   outcomemedian=a$median, responsemedian=b$median)

我认为合并无效,因为a和b的长度不同。 rowbinding a和b也混合了a和b的不同均值和中位数,理想情况下我想要一个rbindlist,每个列都有一些后缀,如c(&#34; .a&#34;,&#34;。 b&#34;。)

更新: 我得到一个错误(因为a和b有不同的维度)在做

DTfinal <- rbindlist(setNames(list(a[, c("grp", "time", "mean", "median"),
                                     with = FALSE], 
                                   b[, c("grp", "time", "mean", "median"),
                                     with = FALSE]), 
                                    c("a", "b")),
                                    idcol= "id")

dcast(DTfinal, grp + time ~id, value.var = c('mean', 'median')) 

返回的地方

Aggregate function missing, defaulting to 'length'

1 个答案:

答案 0 :(得分:2)

我们可以在将数据集放入"1 + 2" "apple,pear"

后使用rbindlist
list

假设两个数据集的列数不同,并且我们需要保留一个列名称向量

DTfinal <- rbindlist(list(a,b))
dim(DTfinal)
#[1] 400   4
dim(a)
#[1] 200   4
dim(b)
#[1] 200   4

更新

如果我们需要转换为&#39; wide&#39;格式

nm1 <- intersect(names(a), names(b))
rbindlist(list(a[, nm1, with = FALSE], b[, nm1, with = FALSE]), idcol= "id")