R使用水平均值/模式/等来估算数据

时间:2012-02-12 02:50:39

标签: r

我有一个数据框,我想根据行均值而不是列均值来估算缺失值。

id       Price1         Price2           Price3        Price4    HorizontalMean
004        NA             101              103           114            106
005       100             108               78            99             96.25
006        34              33               NA            78             48.333
...

我看了几个包,似乎找不到任何明确提到的包。任何建议或我是否需要先进行转置(这可能是一个问题,因为数据是> 100k行)。

2 个答案:

答案 0 :(得分:4)

这是一个不错的小单线:

> df <- data.frame(Price1 = c(NA, 100, 34),
+                  Price2 = c(101, 108, 33),
+                  Price3 = c(103, 78, NA),
+                  Price4 = c(114, 99, 78))
> df
  Price1 Price2 Price3 Price4
1     NA    101    103    114
2    100    108     78     99
3     34     33     NA     78

> df <- ifelse(is.na(df), rowMeans(df, na.rm=TRUE), unlist(df))
> df
     Price1 Price2    Price3 Price4
[1,]    106    101 103.00000    114
[2,]    100    108  78.00000     99
[3,]     34     33  48.33333     78
编辑:对于@Charlie,他问你如何用列方式替换NAs,你可以使用相同的东西,但用重复列的向量替换rowMeans(...)意味着:

df <- ifelse(is.na(df), rep(colMeans(df, na.rm=TRUE), rep(nrow(df), ncol(df))),
             unlist(df))

或将ifelse应用于列表的每一列:

df <- sapply(df, function(x)ifelse(is.na(x), mean(x, na.rm=TRUE), x))

答案 1 :(得分:3)

您可以使用applyifelse手动执行此操作。

# Sample data
d <- matrix(rnorm(20), nc=2)
d[ sample(1:20,3) ] <- NA
d <- as.data.frame(d)
d$mean <- apply(d, 1, mean, na.rm=TRUE)

# Replace missing values, only in the first two columns
d[,1:2] <- apply( 
  d[,1:2], 
  2, 
  function(u) ifelse(is.na(u), d$mean, u) 
)