这可以在
data.table
中完成。
library(data.table)
setDT(x)[, N:= 1:.N][, othermpg2:=mean(x[N!= .BY, mpg]), by=N][,N:=NULL]
x
# name cyl mpg othermpg othermpg2
#1: Datsun 710 4 22.8 27.05 27.05
#2: Merc 240D 4 24.4 26.89 26.89
#3: Merc 230 4 22.8 27.05 27.05
#4: Fiat 128 4 32.4 26.09 26.09
#5: Honda Civic 4 30.4 26.29 26.29
#6: Toyota Corolla 4 33.9 25.94 25.94
#7: Toyota Corona 4 21.5 27.18 27.18
#8: Fiat X1-9 4 27.3 26.60 26.60
#9: Porsche 914-2 4 26.0 26.73 26.73
#10: Lotus Europa 4 30.4 26.29 26.29
#11: Volvo 142E 4 21.4 27.19 27.19
- 首先创建一行索引/列
N:=1:.N
- 按照该索引进行分组
by=N]
x[N!= .BY, mpg]
给出了与分组变量不相等的 mpg
行
- 求均值
N:=NULL
由于 N 不再需要,因此删除该列。
或者你可以尝试以下方法(灵感来自 @thelatemail 的答案)
setDT(x)[, N:=1:.N]
setkey(x, N)
x[,othermpg2 := mean(x[!.BY, mpg]), by=N][,N:=NULL]
或者不用创建N
(来自@Jon Clayden的评论)
setDT(x)[, othermpg2:=mean(x[name!=.BY,mpg]), by=name]
使用
dplyr
,这似乎可以工作。
x %>%
mutate(N=1:n()) %>%
do( data.frame(.,othermpg2=sapply(.$N, function(i) mean(.$mpg[!.$N %in% i]))))
mutate
函数。 - David Arenburg