为什么 dcast 不可能传递非聚合函数?

why is dcast so impossible to pass a non-aggregate function?

我正在为 table 使用 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)数据 table 来自这个 table 的一些汇总统计数据。我首先创建了两个中介 tables 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 的长度不同。行绑定 a 和 b 也混合了 a 和 b 的不同均值和中位数,理想情况下我想要一个 rbindlist,它对每一列都有某种后缀,比如 c(".a",".b").

更新: 我得到一个错误(因为 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')) 

它在哪里 returns

Aggregate function missing, defaulting to 'length'

将数据集放入 list

后,我们可以使用 rbindlist
DTfinal <- rbindlist(list(a,b))
dim(DTfinal)
#[1] 400   4
dim(a)
#[1] 200   4
dim(b)
#[1] 200   4

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

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

更新

如果我们需要转换成'wide'格式

DTfinal <-  rbindlist(setNames(list(a,b), c("a", "b")), idcol= "id")
dcast(DTfinal, grp + time ~id, value.var = c('mean', 'median'))
#     grp time       mean_a    mean_b    median_a median_b
#  1:   a    1   0.52171471  25.99502 -0.06558068       25
#  2:   a    2   0.36445108  25.99010  0.13518412       25
#  3:   a    3   0.08993721  25.98522  0.20128790       25
#  4:   a    4 -64.04617391  25.98039  0.40999376       25
#  5:   a    5   0.81730847  25.97561 -0.03481697       25
# ---                                                     
#196:   d   46   1.62818374 176.67568 -0.26695999      176
#197:   d   47  -1.45259871 176.67340  0.14893356      176
#198:   d   48   9.59796683 176.67114 -0.05834959      176
#199:   d   49  -2.74285453 176.66890 -0.22094347      176
#200:   d   50   1.22109043 176.66667 -0.08172928      176