从分组 data.table 中确定中位数、方差 ...,同时排除焦点观察
Determine median, variance ... from grouped data.table while excluding focal observation
我正在尝试从分组数据框中确定各种统计数据(中位数、方差、平均值、最小值、最大值),同时始终排除焦点观察。其他一些问题,特别是 here, here, and 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 行,它需要计算具有 id = 1
和 rank = 1
的所有观察值的 value
的中位数、均值、方差和最小值,不包括第一个值(给定 set.seed(1)
,这个值应该是0.26550866。
根据@Khashaa 的建议,我需要澄清的是,最终结果应该是与原始data.table 长度相同的data.table。因此,对于 id = 1
、rank = 1
组合,我需要第 1、21、41、61 和 81 行的不同结果(在 dd 中,在执行 setkey
之前),因为每次不同 value
被省略。
在setkey
命令之后,前5行都有id = 1
和rank = 1
,所以我要找的是rank和id的特定组合的各种统计数据,排除焦点行:即
具体来说,对于 rank = 1
和 id = 1
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)
我在R中简单计算如下
> 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
希望这能澄清!
在我的 data.table 中,其中一些统计数据将丢失,理想情况下会导致 NA
值
这是否达到了您想要的结果?
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
...
我正在尝试从分组数据框中确定各种统计数据(中位数、方差、平均值、最小值、最大值),同时始终排除焦点观察。其他一些问题,特别是 here, here, and 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 行,它需要计算具有 id = 1
和 rank = 1
的所有观察值的 value
的中位数、均值、方差和最小值,不包括第一个值(给定 set.seed(1)
,这个值应该是0.26550866。
根据@Khashaa 的建议,我需要澄清的是,最终结果应该是与原始data.table 长度相同的data.table。因此,对于 id = 1
、rank = 1
组合,我需要第 1、21、41、61 和 81 行的不同结果(在 dd 中,在执行 setkey
之前),因为每次不同 value
被省略。
在setkey
命令之后,前5行都有id = 1
和rank = 1
,所以我要找的是rank和id的特定组合的各种统计数据,排除焦点行:即
具体来说,对于 rank = 1
和 id = 1
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)
我在R中简单计算如下
> 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
希望这能澄清!
在我的 data.table 中,其中一些统计数据将丢失,理想情况下会导致 NA
值
这是否达到了您想要的结果?
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
...