在下面的代码中,我想知道是否有人对如何使用 plyr 或 data.table 优雅地计算 med.val2 有任何见解。
library(plyr)
设置示例数据
data <- data.frame(id1 = 1:20, id2 = rep(letters[1:4], 5), vals=rnorm(20))
首先通过循环计算组中位数
data$med.val <- rep(0, 20)
for (ind in 1:20) data$med.val[ind] <- median(data$vals[data$id2==data$id2[ind]])
现在使用 plyr
data <- ddply(data, .(id2), mutate, med.val.plyr=median(vals))
应该相等
all.equal(data$med.val, data$med.val.plyr)
具有相同 id2 的行的中位数,不包括焦点行
# Median of values corresponding to
# data$id1!=data$id1[ind] & data$id2==data$id2[ind]
data$med.val2 <- rep(0, 20)
for (ind in 1:20) data$med.val2[ind] <- median(data$vals[data$id1!=data$id1[ind] & data$id2==data$id2[ind]])
在 R 中,我通常使用 plyr 或 data.table 来有效地按组计算值。我的实际数据和函数更复杂但结构相同:我需要使用具有公共标识符的行中的数据来计算函数,不包括焦点行。我想不出一种有效而优雅的方法。