Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将某列中的NA替换为同一列中相等键的值_R_Data.table - Fatal编程技术网

R 将某列中的NA替换为同一列中相等键的值

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

我根据标准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  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]