用R中相邻列中的值替换NA
必要时,我想将IMIAVG列中的NA替换为同一行中IMILefit或IMIRIGHT列中的值(即第1、6、7行)。我试过很多方法,但似乎都不管用。这需要一个循环吗?请注意,错误总是伴随着原子向量出现。谢谢用R中相邻列中的值替换NA,r,vector,replace,atomic,na,R,Vector,Replace,Atomic,Na,必要时,我想将IMIAVG列中的NA替换为同一行中IMILefit或IMIRIGHT列中的值(即第1、6、7行)。我试过很多方法,但似乎都不管用。这需要一个循环吗?请注意,错误总是伴随着原子向量出现。谢谢 IMILEFT IMIRIGHT IMIAVG NA 71.15127 NA 72.18310 72.86607 72.52458 70.61460 68.00766 69.3
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
如果在
IMILEFT
和imright
之间只有一个值不是NA
(如您的示例所示),只需尝试(df
是您的数据帧):
从根本上解决问题
数据
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))
dfdf%
变异(
IMIAVG=ifelse(
is.na(IMIAVG),
ifelse(is.na(IMIRIGHT)、imilft、IMIRIGHT),
IMIAVG
)
)
您也可以使用pmax
indx <- is.na(df$IMIAVG)
df$IMIAVG[indx] <- do.call(pmax, c(df[indx, 1:2], na.rm=TRUE))
你好,谢谢@nicola。因此,只有在左列中有值时,才会更改NA。关于如何对右列执行此操作,您有什么想法吗?没有,这应该会更改IMIAVG
列,该列的值在IMILEFT
和IMIRIGHT
之间不是NA
。它适用于样本数据,可能您的数据有点不同。谢谢@尼古拉!!!!!这意味着完全成功了!!!!!好几天来我一直想得到这个!非常感谢。
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))
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
)
)
indx <- is.na(df$IMIAVG)
df$IMIAVG[indx] <- do.call(pmax, c(df[indx, 1:2], na.rm=TRUE))
library(data.table)
setDT(df)[is.na(IMIAVG), IMIAVG:=pmax(IMILEFT, IMIRIGHT, na.rm=TRUE)]