R 为数据帧给定列的每个观察调用函数
我的DF如下所示: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
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][]