【问题标题】:replacing NA with value in adjacent column in R用R中相邻列中的值替换NA
【发布时间】:2015-07-28 02:53:36
【问题描述】:

我想在必要时将 IMIAVG 列中的 NA 替换为同一行中 IMILEFT 或 IMIRIGHT 列中的值(即第 1、6、7 行)。我尝试了多种方法,但似乎没有任何效果。这需要循环吗?请注意,原子向量不断出现错误。谢谢!

  IMILEFT       IMIRIGHT       IMIAVG
  NA            71.15127         NA
  72.18310      72.86607      72.52458
  70.61460      68.00766      69.31113
  69.39032      69.91261      69.65146
  72.58609      72.75168      72.66888
  70.85714         NA            NA
  NA            69.88203         NA
  74.47109      73.07963      73.77536
  70.44855      71.28647      70.86751
  NA            72.33503         NA
  69.82818      70.45144      70.13981
  68.66929      69.79866      69.23397
  72.46879      71.50685      71.98782
  71.11888      71.98336      71.55112
  NA            67.86667         NA

【问题讨论】:

    标签: r vector replace atomic na


    【解决方案1】:
    df <- read.table(text = "IMILEFT       IMIRIGHT       IMIAVG
      NA            71.15127         NA
      72.18310      72.86607      72.52458
      70.61460      68.00766      69.31113
      69.39032      69.91261      69.65146
      72.58609      72.75168      72.66888
      70.85714         NA            NA
      NA            69.88203         NA
      74.47109      73.07963      73.77536
      70.44855      71.28647      70.86751
      NA            72.33503         NA
      69.82818      70.45144      70.13981
      68.66929      69.79866      69.23397
      72.46879      71.50685      71.98782
      71.11888      71.98336      71.55112
      NA            67.86667         NA" , header = T)
    
    library("dplyr")
    
        df %>%
      mutate(
        IMIAVG = ifelse(
                          is.na(IMIAVG) , 
                          ifelse(is.na(IMIRIGHT) ,IMILEFT ,IMIRIGHT  ) , 
                          IMIAVG
                       )
             )
    

    【讨论】:

      【解决方案2】:

      你也可以使用pmax

      indx <- is.na(df$IMIAVG)
      df$IMIAVG[indx] <- do.call(pmax, c(df[indx, 1:2], na.rm=TRUE))
      

      或使用data.table

      library(data.table) 
      setDT(df)[is.na(IMIAVG), IMIAVG:=pmax(IMILEFT, IMIRIGHT, na.rm=TRUE)]
      

      【讨论】:

        【解决方案3】:

        如果IMILEFTIMIRIGHT 中只有一个值不是NA(如您的示例所示),请尝试(df 是您的data.frame):

        indx<-is.na(df$IMIAVG)
        df$IMIAVG[indx]<-rowSums(df[indx,1:2],na.rm=TRUE)
        

        顺便说一句,如果你想找到每一行的平均值并排除过程中的NA值,你可以在函数rowMeans中将na.rm参数设置为TRUE。我想你可以得到你的最后一列:

        rowMeans(df[,1:2],na.rm=TRUE)
        

        从根本上消除问题。

        数据

        df<-structure(list(IMILEFT = c(NA, 72.1831, 70.6146, 69.39032, 72.58609, 
        70.85714, NA, 74.47109, 70.44855, NA, 69.82818, 68.66929, 72.46879, 
        71.11888, NA), IMIRIGHT = c(71.15127, 72.86607, 68.00766, 69.91261, 
        72.75168, NA, 69.88203, 73.07963, 71.28647, 72.33503, 70.45144, 
        69.79866, 71.50685, 71.98336, 67.86667), IMIAVG = c(NA, 72.52458, 
        69.31113, 69.65146, 72.66888, NA, NA, 73.77536, 70.86751, NA, 
        70.13981, 69.23397, 71.98782, 71.55112, NA)), .Names = c("IMILEFT", 
        "IMIRIGHT", "IMIAVG"), class = "data.frame", row.names = c(NA, 
        -15L))
        

        【讨论】:

        • 嗨,谢谢@nicola。这样只有在 LEFT 列中有值时才更改 NA。关于如何为 RIGHT 列也或单独执行此操作的任何想法?
        • 不,这应该在IMILEFTIMIRIGHT 之间更改值不是NAIMIAVG 列。它适用于示例数据,可能您的数据有点不同。
        • 谢谢!!!! @尼古拉!!!! rowmeans 完全有效!!!!这几天我一直在努力!谢谢!
        猜你喜欢
        • 1970-01-01
        • 2012-11-10
        • 2017-04-22
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        • 2021-09-22
        • 1970-01-01
        相关资源
        最近更新 更多