R 将某列中的NA替换为同一列中相等键的值
我根据标准C为一个组创建了一个平均值列。现在我希望这些平均值在整个列上都填写,即使标准C不适用。所以基本上我想用为该组计算的平均值来代替NA。您可以在下一个Data.table中看到grp、val和C列R 将某列中的NA替换为同一列中相等键的值,r,data.table,R,Data.table,我根据标准C为一个组创建了一个平均值列。现在我希望这些平均值在整个列上都填写,即使标准C不适用。所以基本上我想用为该组计算的平均值来代替NA。您可以在下一个Data.table中看到grp、val和C列 grp val C 1: 1 NA 0 2: 1 NA 0 3: 1 42 1 4: 1 42 1 5: 2 16 1 6: 2 16 1 7: 2 NA 0 8: 2 NA 0 9: 3 32 1 10: 3
grp val C
1: 1 NA 0
2: 1 NA 0
3: 1 42 1
4: 1 42 1
5: 2 16 1
6: 2 16 1
7: 2 NA 0
8: 2 NA 0
9: 3 32 1
10: 3 32 1
11: 3 32 1
12: 3 32 1
因此,我想用同一组中的平均值替换val
NA
。
下面是我如何尝试这样做的示例代码。
基本上,我提取另一个数据.表
,删除NA
和重复项,然后尝试将其与原始表合并
x <- data.table(grp=c(1,1,1,1,2,2,2,2,3,3,3,3),val=c(NA,NA,42,42,16,16,NA,NA,32,32,32,32),C=c(0,0,1,1,1,1,0,0,1,1,1,1))
y <- x[!is.na(val),]
y <- y[!duplicated(y),]
setkey(x,grp)
setkey(y,grp)
x[y,val:=val,by=grp]
x对于使用组平均值插补NA,数据。表
和dplyr
将很好地发挥作用(数据表与dplyr是一个单独的讨论)。有关数据,请参考@David Arenburg的评论。表用平均值替换NA的方法代码
使用dplyr:
library(dplyr)
df %>% group_by(grp) %>% mutate(val= replace(val, is.na(val), mean(val, na.rm=TRUE))) # ifelse can also be tried instead of replace
不那么优雅的方式是通过与ddply相结合的自定义函数:
library(plyr)
# function to replace NA with mean for that group
impute.mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))
df <- ddply(df, ~ grp, transform, val = impute.mean(val))
库(plyr)
#函数将NA替换为该组的平均值
impute.mean所以这个问题似乎带来了很多“噪音”,所以我将添加这个作为答案
因此,data.table
有一个“参考运算符赋值”,即:=
(有关更多信息和用例/基准,请参阅)
此运算符将值分配给特定组的所有成员(尽管您也可以使用它,而无需任何分组),类似于dplyr
中的mutate
函数或ave
和transform
基R中的(这对于这个问题来说并不太重要,但可能是它相对于其他包/基本R中的等价物的最大优势),即,它在使用时更新数据集本身而不创建副本,而使用是否只需要x[,val:=mean(val,na.rm=TRUE),grp]
??似乎是这样的…:o我已经花了将近一天的时间在这方面……谢谢!别忘了回答您的问题,将其从未答复列表中删除:)您可能希望在1.9.6中有更好的文档。@AlexBrown不明白dplyr
或特别是plyr
如何提供比简单的数据行更好的解决方案。表syntax@AlexBrown首先,这是一个data.table问题,其次,关于x[,val:=mean(val,na.rm=TRUE),grp]
有什么复杂之处?为什么OP需要加载其他一些永远不会达到这种性能/简单性的包(也没有引用赋值操作符(:=
))。此外,plyr的核心内容如何比数据表更重要??更不用说它的性能甚至比base R还要差,而且它已经完全过时了。为什么最好的方法是使用ddply
?只有data.table
语法有什么问题?他已经在用了?如果您已经使用了plyr
路径,那么为什么您需要创建一个新函数,ddply(x,~grp,transform,val=mean(val,na.rm=TRUE))
?我意识到了我的错误,谢谢David。我现在已经编辑了答案,并对您包含代码的评论进行了投票。
x[, .(val = mean(val, na.rm = TRUE)), grp]
x[, list(val = mean(val, na.rm = TRUE)), grp]
x[, mean(val, na.rm = TRUE), grp] # will call the aggregated variable `V1` by default
x[, val := mean(val, na.rm = TRUE), grp]