【问题标题】:Replace NA with row mean in R for subset将 NA 替换为 R 中的行均值作为子集
【发布时间】:2021-06-24 13:55:15
【问题描述】:

我有一个包含三个子量表的问卷数据集。如果某个子尺度连续缺少数据,我想用行平均值替换该特定列值。

对于示例数据,我想表现得好像只有一个子量表,由 c1 和 c2 组成。

c1 <- c(1,2,3,NA,4)
c2 <- c(1,NA,45,4,100)
c3 <- c(NA,2,3,9,NA)
data <- data.frame(c1,c2,c3)

我尝试了几件事,但都没有奏效。

for(i in 1:nrow(data[,c(1,2)])){
  for(n in 1:ncol(data[,c(1,2)])){
    if(is.na(data[,c(1,2)][i,n])){
      data[,c(1,2)][i,n]  <-  mean(t(data[,c(1,2)][i,]), na.rm = T)}}} 

#Version 2
k <- which(is.na(data[,c(1,2)]),arr.ind=TRUE) 
data[,c(1,2)][[k]] <- rowMeans(data[,c(1,2)],na.rm=TRUE)[k[,1]]

对于版本 1,替换了具有一个 NA 的列中的所有值。对于版本 2,它显示了一条错误消息。

非常感谢您的帮助。

PS:这是一个编码问题(与方法的统计适当性无关)。

【问题讨论】:

    标签: r for-loop replace row


    【解决方案1】:

    这是一个使用 dplyr 的解决方案:

    data <- data %>% 
    mutate(c1 = ifelse(is.na(c1),rowMeans(data[row_number(),], na.rm = T),c1),
           c2 = ifelse(is.na(c2),rowMeans(data[row_number(),], na.rm = T),c2),
           c3 = ifelse(is.na(c3),rowMeans(data[row_number(),], na.rm = T),c3))
    

    【讨论】:

    • 您好!如何对大量列执行此操作 + 如何限制计算平均值的行? (对于数据示例,rowMeans 中应该只包含 c1 和 c2)
    • 我在这里看到一个问题:如果您想估算 c2 或 c1 列的值,您将无法获得 c1 和 c2 的平均值。对于大量的列,您可以创建一个函数:MyFunction &lt;- function(table){ for(i in ncol(table)){ table &lt;- table %&gt;% mutate(paste("c",i) = ifelse(...)) } }
    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 2020-04-09
    • 2014-08-12
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    相关资源
    最近更新 更多