确定中位数,方差...从分组data.table,同时排除焦点观察

时间:2015-03-27 03:10:09

标签: r data.table median

我正在尝试从分组数据框中确定各种统计数据(中位数,方差,平均值,最小值,最大值),同时始终排除焦点观察。其他一些问题,尤其是hereherehere,已经触及了这个问题,但提供的解决方案似乎并不适用于我。

考虑以下可重现的示例

library(data.table)
set.seed(1)
dd <- data.table(cbind(id = rep(seq(1,5,by = 1),20)),rank = rep(seq(1,4,by=1),25),value = runif(100))

简单计算每组的均值和方差以及其他统计数据可以如下实现

setkey(dd, id, rank)
a <- dd[, list(Med = median(value, na.rm=T), Aver = mean(value, na.rm=T), Var = var(value, na.rm=T), min = min(value, na.rm=T)), by = key(dd)

我正在寻找一些非常相似的代码,但也排除了焦点行中的值。因此,对于第1行,它需要计算valueid = 1的所有观察值的rank = 1的中位数,均值,方差和最小值,不包括第一个值(给定{{1} },此值应为0.26550866。

根据@Khashaa的建议,我需要澄清最终结果应该是与原始data.table长度相同的data.table。因此,对于set.seed(1)id = 1组合,我需要针对第1,21,41,61和81行(在dd中执行rank = 1之前)的不同结果,因为每次a正在省略不同的setkey

value命令之后,前5行都有setkeyid = 1,所以我要找的是排名和id的特定组合的各种统计数据,排除焦点行:即 具体而言,适用于rank = 1rank = 1

id = 1

我在R

中简单地计算了这个
Row 1 : mean = .7757, median = .8669, var = .05415 (excluding row 1 value)
Row 3 : mean = .6369, median = .6738, var = .1146 (excluding row 3 value)
Row 5 : mean = .7335, median = .8669, var = .09977 (excluding row 5 value)

希望这澄清!

在我的data.table中,有些统计信息会丢失,理想情况下会导致> df <- data.frame(dd) > mean(df[2:5,3]) [1] 0.7757967 > median(df[2:5,3]) [1] 0.8669111 > var(df[2:5,3]) [1] 0.05415191 > mean(df[c(1,2,4,5),3]) [1] 0.6369373 > median(df[c(1,2,4,5),3]) [1] 0.6737677 > var(df[c(1,2,4,5),3]) [1] 0.1145611 > mean(df[1:4,3]) [1] 0.733509 > median(df[1:4,3]) [1] 0.8669111 > var(df[1:4,3]) [1] 0.099774

1 个答案:

答案 0 :(得分:1)

这是否达到了预期的效果?

loo <- function(x, f) unlist(lapply(1:length(x), function(i)f(x[-i])))
dd[, list(Med = loo(value, median), Aver =loo(value, mean), Var = loo(value, var), min=loo(value, min)), by = key(dd)]
#    id rank       Med      Aver         Var        min
#1:  1    1 0.8669111 0.7757967 0.054151907 0.43465948
#2:  1    1 0.6278029 0.6084976 0.095213904 0.26550866
#3:  1    1 0.6737677 0.6369373 0.114561137 0.26550866
#4:  1    1 0.6278029 0.6139549 0.099762613 0.26550866
#5:  1    1 0.8669111 0.7335090 0.099774004 0.26550866
...