我正在学习dplyr
R包并且到目前为止非常喜欢它。我需要做的一件事是创建一个新列,其中每行的值是将函数应用于除当前行之外的所有行的结果(可能是按组子集),但我无法找到一个简洁的方法。这样做。
一个人为的例子是
library(datasets)
library(dplyr)
data(mtcars)
x <- mtcars %>% mutate(name=rownames(mtcars)) %>% filter(cyl==4) %>% select(name,cyl,mpg)
# This is what I want to do more elegantly
x$othermpg <- NA
for (i in 1:nrow(x))
x$othermpg[i] <- mean(x$mpg[-i])
此处,othermpg
列获取除当前行中的汽车之外的所有汽车的mpg
值的平均值。
有人可以帮忙吗?
答案 0 :(得分:2)
这可以在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&#39;)
setDT(x)[, N:=1:.N]
setkey(x, N)
x[,othermpg2 := mean(x[!.BY, mpg]), by=N][,N:=NULL]
或者没有创建N
(来自@Jon Clayden&#39;)
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]))))
# name cyl mpg othermpg N othermpg2
#1 Datsun 710 4 22.8 27.05 1 27.05
#2 Merc 240D 4 24.4 26.89 2 26.89
#3 Merc 230 4 22.8 27.05 3 27.05
#4 Fiat 128 4 32.4 26.09 4 26.09
#5 Honda Civic 4 30.4 26.29 5 26.29
#6 Toyota Corolla 4 33.9 25.94 6 25.94
#7 Toyota Corona 4 21.5 27.18 7 27.18
#8 Fiat X1-9 4 27.3 26.60 8 26.60
#9 Porsche 914-2 4 26.0 26.73 9 26.73
#10 Lotus Europa 4 30.4 26.29 10 26.29
#11 Volvo 142E 4 21.4 27.19 11 27.19
答案 1 :(得分:1)
对于示例案例,您可以使用以下代码来避免for循环。基本上,不是排除&#34;当前&#34;你只需从总数中减去它:
library(dplyr)
x %>% mutate(othermpg2 = (sum(mpg)-mpg) / (length(mpg) -1 ))
# 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
如果您认为这不适用于您的实际数据,请使用更具代表性的示例编辑您的问题。