10

我有一个带有 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
4

5 回答 5

11

与@baptiste 的回答非常相似

> ind <- which(is.na(df), arr.ind=TRUE)
> df[ind] <- rowMeans(df,  na.rm = TRUE)[ind[,1]]
于 2013-07-23T14:23:46.053 回答
4

我认为这行得通,

df[which(is.na(df), arr.ind=TRUE)] <- rowMeans(df[!complete.cases(df), ], na.rm=TRUE)
于 2013-07-23T14:20:38.763 回答
3

使用apply(注意返回的对象是 a 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 行,否则你不会注意到)。

于 2013-07-23T14:21:32.600 回答
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

有没有更优雅的方式,尤其是当有人有很多列时?

于 2013-07-23T14:10:15.153 回答
2

另一种选择是na.aggregatelibrary(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
于 2015-11-11T05:01:56.790 回答