我有一个带有NA的数据框,我想用行方式替换NA
c1 = c(1,2,3,NA)
c2 = c(3,1,NA,3)
c3 = c(2,1,3,1)
df = data.frame(c1,c2,c3)
> df
c1 c2 c3
1 1 3 2
2 2 1 1
3 3 NA 3
4 NA 3 1
这样
> df
c1 c2 c3
1 1 3 2
2 2 1 1
3 3 3 3
4 2 3 1
答案 0 :(得分:10)
非常类似于@ baptiste的回答
> ind <- which(is.na(df), arr.ind=TRUE)
> df[ind] <- rowMeans(df, na.rm = TRUE)[ind[,1]]
答案 1 :(得分:4)
我认为这很有效,
df[which(is.na(df), arr.ind=TRUE)] <- rowMeans(df[!complete.cases(df), ], na.rm=TRUE)
答案 2 :(得分:3)
使用apply
(请注意返回的对象是matrix
):
t( apply( df , 1 , function(x) { x[ is.na(x) ] = mean( x , na.rm = TRUE ); x } ) )
c1 c2 c3
[1,] 1 3 2
[2,] 2 1 1
[3,] 3 3 3
[4,] 2 3 1
我们使用任何匿名函数将每行中NA
的值更改为该行的mean
。唯一的优点是,如果行数增加,您不必再进行任何打字。它在计算意义上不是特别有效或快速,但在认知意义上更是如此(除非你有000,000行,否则你不会注意到)。
答案 3 :(得分:2)
我的解决方案是
rwmns = rowMeans(df,na.rm=TRUE)
df$c1[is.na(df$c1)] = rwmns[is.na(df$c1)]
df$c2[is.na(df$c2)] = rwmns[is.na(df$c2)]
df$c3[is.na(df$c3)] = rwmns[is.na(df$c3)]
> df
c1 c2 c3
1 1 3 2
2 2 1 1
3 3 3 3
4 2 3 1
是否有更优雅的方式,特别是当有人有很多列?
答案 4 :(得分:2)
转置数据集后,na.aggregate
的另一个选项是library(zoo)
library(zoo)
df[] <- t(na.aggregate(t(df)))
df
# c1 c2 c3
#1 1 3 2
#2 2 1 1
#3 3 3 3
#4 2 3 1