我有一个数据框,我想根据行均值而不是列均值来估算缺失值。
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行)。
答案 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)
您可以使用apply
和ifelse
手动执行此操作。
# 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)
)