【问题标题】:Substituting missing values based on both row and column averages根据行平均值和列平均值替换缺失值
【发布时间】:2015-11-03 03:49:36
【问题描述】:

据我所知,数据框中的缺失数据 (NA) 可以用基于行或基于列的平均值代替。但是我在 R 中尝试做的(但不确定是否可能)是基于缺失值的单元格所在的行和列计算缺失单元格的平均值。我想知道您是否有任何建议。

这是带有 NA 的示例数据:

nr <- 50
mm <- t(matrix(sample(0:4, nr * 15, replace = TRUE), nr))
mm[,c(4,7,12,13)]<-NA
mm[c(3,5,8,9,10,13),]<-NA

【问题讨论】:

标签: r


【解决方案1】:

假设 OP 想要根据该索引的行/列平均值替换 NA 元素,我们使用 whicharr.ind=TRUE ('ind') 获得行/列索引。获取由'ind'的列子集的数据集('df')的colMeansrowMeans,并将NA元素替换为'c1'和'r1'对应元素的平均值。

ind <- which(is.na(df), arr.ind=TRUE)
c1 <- colMeans(df[,ind[,2]], na.rm=TRUE)
r1 <- rowMeans(df[ind[,1],], na.rm=TRUE)
df[ind] <- colMeans(rbind(c1, r1))

或者正如@thelatemail 建议的那样,我们可以使用outer 来获取colMeansrowMeans 的组合,然后根据它替换NA 值。

ind <- is.na(df)
df[ind] <- (outer(rowMeans(df,na.rm=TRUE), colMeans(df,na.rm=TRUE), `+`)/2)[ind]

数据

set.seed(24)
df <- as.data.frame(matrix( sample(c(NA, 0:5), 10*10, replace=TRUE), ncol=10))

【讨论】:

  • 不需要which 等...ind &lt;- is.na(df) 就足够了。将:df[ind] &lt;- (outer(rowMeans(df,na.rm=TRUE), colMeans(df,na.rm=TRUE), `+`)/2)[ind] 使用相同的概念。
  • @thelatemail 它有效。看起来是一种不同的方法。您对将其作为单独的解决方案发布不感兴趣吗?
  • 我不知道是否值得一个新的答案。它与您建议的mean(row+col) 方法基本相同,只是稍微更改了分配。
  • 上述解决方案有效,但是在所有值为 Na 的列中,不计算平均值,而是将单元格标记为 NaN。有没有办法修改上面的代码,在这种情况下只依赖行平均值,而不是写 NaN?
  • @akrun 目前我使用此代码仅占行 k &lt;- which(is.na(df), arr.ind=TRUE); df[k] &lt;- rowMeans(df, na.rm=TRUE)[k[,1]] ,希望在“平均”过程中包含列但不获取仅由 NaN 组成的列
猜你喜欢
  • 2018-02-05
  • 2012-05-03
  • 2018-12-27
  • 1970-01-01
  • 2017-02-24
  • 2020-08-15
  • 1970-01-01
  • 2013-09-07
相关资源
最近更新 更多