用R中相邻列中的值替换NA

时间:2015-05-16 05:11:21

标签: r vector replace atomic na

我想在必要时将IMIAVG列中的NA替换为同一行中IMILEFT或IMIRIGHT列中的值(即第1,6,7行)。我尝试过很多东西,但似乎没什么用。这需要循环吗?请注意错误不断出现原子矢量。 THX!

  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

3 个答案:

答案 0 :(得分:4)

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

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

顺便说一句,如果要查找每行的平均值并排除流程中的NA值,可以在函数{{中将na.rm参数设置为TRUE。 1}}。我想你可以获得你的最后一栏:

rowMeans

从根本处删除问题。

数据

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

答案 1 :(得分:1)

您也可以使用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)]

答案 2 :(得分:0)

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
                   )
         )