R 为数据帧给定列的每个观察调用函数

R 为数据帧给定列的每个观察调用函数,r,R,我的DF如下所示: A B C 1 11 12 1 9 NA 1 17 NA 2 16 11 2 8 NA 2 6 12 3 14 13 3 16 NA 3 9 12 我需要通过为第3列中的每个缺失值调用函数来替换NA 该函数仅计算第1列的平均值,其中A=缺失观测值的A 例如,第3行的缺失值为(11+9+17)/3 是否有一种模式可以让我不必在表格中循环就可以做到这一点?有点像 miss

我的DF如下所示:

A    B   C
1    11   12
1    9    NA
1    17   NA
2    16   11
2    8    NA
2    6    12
3    14   13
3    16   NA
3    9    12
我需要通过为第3列中的每个缺失值调用函数来替换NA

该函数仅计算第1列的平均值,其中A=缺失观测值的A

例如,第3行的缺失值为(11+9+17)/3

是否有一种模式可以让我不必在表格中循环就可以做到这一点?有点像

missingValue<-function(df,A){

   missingValue<-mean(df[,2)<-df[,1]=A)

} 

if (is.na(df[,3])) {
     call missingValue
}

missingValue这是
ave
的一个明显用例。不需要循环

d <- read.table(text = "A    B   C
1    11   12
1    9    NA
1    17   NA
2    16   11
2    8    NA
2    6    12
3    14   13
3    16   NA
3    9    12", header = TRUE)

d$C[is.na(d$C)] <- ave(d$B, d$A, FUN = function(x) mean(x, na.rm = TRUE))[is.na(d$C)]
以下是dplyr方法(使用@Thomas的数据):


假设@Thomas对您的预期结果是正确的,您还可以查看
replace

为了共享备选方案,这里的
替换为“data.table”:


您还可以在创建
data.table
后使用
by=.EACHI
从中获取值,如下所示:

DF <- as.data.table(DF)
D2 <- setkey(DF, A)[, mean(B), by = A]
DF[, C := as.numeric(C)][D2, C := replace(C, is.na(C), V1), by = .EACHI][]

DF不太清楚。。。。第2行和第3行的值会相同吗?@AnandaMahto是的,在样本数据的情况下,但我的真实数据当然要大得多。那么你应该选择我的选项——它是最快的:-)@LeeJH——我并不是真的想让你改变接受的答案……太好了;我在考虑“do.call by”组合:(是的,
as.numeric
真的很痛苦。这就是为什么我没有在前面发布这个答案。我很惊讶
data.table
现在默认强制使用原始列类型,而不是只给出一个warning@DavidArenburg,我很想把它作为一个新的专栏:-)是的,我也是。但后来决定,对于这样一个简单的问题来说,整个事情都是一团糟,汤马斯的答案对于这个案例来说可能已经足够好了。(+1)对于
替换
以前从未听说过。感谢大家的评论。这些模式非常强大。不仅是缺少值,而且在许多情况下,如果存在条件,则需要调用函数。
require(dplyr)
d %>% group_by(A) %>% mutate(C = ifelse(is.na(C), mean(B, na.rm = TRUE), C))

#Source: local data frame [9 x 3]
#Groups: A
#
#  A  B        C
#1 1 11 12.00000
#2 1  9 12.33333
#3 1 17 12.33333
#4 2 16 11.00000
#5 2  8 10.00000
#6 2  6 12.00000
#7 3 14 13.00000
#8 3 16 13.00000
#9 3  9 12.00000
library(data.table)
as.data.table(DF)[, C := as.numeric(C)][, C := replace(
  C, is.na(C), mean(B)), by = A][]
#    A  B        C
# 1: 1 11 12.00000
# 2: 1  9 12.33333
# 3: 1 17 12.33333
# 4: 2 16 11.00000
# 5: 2  8 10.00000
# 6: 2  6 12.00000
# 7: 3 14 13.00000
# 8: 3 16 13.00000
# 9: 3  9 12.00000
DF <- as.data.table(DF)
D2 <- setkey(DF, A)[, mean(B), by = A]
DF[, C := as.numeric(C)][D2, C := replace(C, is.na(C), V1), by = .EACHI][]