我有两列数据,包括数字和NA条目。没有行,其中两列都具有NA作为该行的条目,但是列都具有NA作为某些行的条目。我想制作一个新的载体。如果我的两个初始列中的一个具有数值,我希望该行的新向量条目为该数值。所以从这里开始:
c1 c2
1 NA
2 NA
NA 3
到此:
c1 c2 c3
1 NA 1
2 NA 2
NA 3 3
我可以使用for循环执行此操作:
for (i in 1:length(c1)) {
if (!is.na(c1[i])) {
c3[i] <- c1[i]
} else {
if (!is.na(c2[i])) {
c3[i] <- c2[i]
}
}
}
但我假设有一种更清洁的方法可以利用R的功能。谢谢!
答案 0 :(得分:3)
您可以使用pmax/pmin
df1$c3 <- do.call(pmax, c(df1, na.rm=TRUE))
df1
# c1 c2 c3
#1 1 NA 1
#2 2 NA 2
#3 NA 3 3
逻辑矩阵(max.col
)上的或!is.na(df1)
以获取每行的最大值的列索引,并提取具有行索引(cbind
)的1:nrow(df1)
元素。
df1$c3 <- df1[cbind(1:nrow(df1),max.col(!is.na(df1)))]
df1 <- structure(list(c1 = c(1L, 2L, NA), c2 = c(NA, NA, 3L)),
.Names = c("c1",
"c2"), class = "data.frame", row.names = c(NA, -3L))