我正在尝试从分组数据框中确定各种统计数据(中位数,方差,平均值,最小值,最大值),同时始终排除焦点观察。其他一些问题,尤其是here,here和here,已经触及了这个问题,但提供的解决方案似乎并不适用于我。
考虑以下可重现的示例
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行,它需要计算value
和id = 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行都有setkey
和id = 1
,所以我要找的是排名和id的特定组合的各种统计数据,排除焦点行:即
具体而言,适用于rank = 1
和rank = 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
值
答案 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
...