我有一个包含几列的数据框,其中每行只有一列可以具有非NA值。我想将列合并为一个,只保留非NA值,类似于这篇文章:
但是,在我的情况下,有些行可能只包含NAs,所以在组合列中,我们应该保留一个NA,就像这样(改编自我提到的帖子):
data <- data.frame('a' = c('A','B','C','D','E','F'),
'x' = c(1,2,NA,NA,NA,NA),
'y' = c(NA,NA,3,NA,NA,NA),
'z' = c(NA,NA,NA,4,5,NA))
所以我会
a x y z
1 A 1 NA NA
2 B 2 NA NA
3 C NA 3 NA
4 D NA NA 4
5 E NA NA 5
6 F NA NA NA
我会得到
'a' 'mycol'
A 1
B 2
C 3
D 4
E 5
F NA
上面提到的帖子的解决方案在我的情况下不起作用因为行F,它是:
cbind(data[1], mycol = na.omit(unlist(data[-1])))
谢谢!
答案 0 :(得分:2)
一个选项是来自coalesce
dplyr
library(tidyverse)
data %>%
transmute(a, mycol = coalesce(!!! rlang::syms(names(.)[-1])))
# a mycol
#1 A 1
#2 B 2
#3 C 3
#4 D 4
#5 E 5
#6 F NA
或者我们可以使用max.col
base R
cbind(data[1], mycol= data[-1][cbind(1:nrow(data),
max.col(!is.na(data[-1])) * NA^!rowSums(!is.na(data[-1]))+1)])
# a mycol
#1 A 1
#2 B 2
#3 C 3
#4 D 4
#5 E 5
#6 F NA
或仅限rowSums
v1 <- rowSums(data[-1], na.rm = TRUE)
cbind(data[1], mycol = v1 * NA^!v1)
或另一个选项是pmax
cbind(data[1], mycol = do.call(pmax, c(data[-1], na.rm = TRUE)))
或pmin
cbind(data[1], mycol = do.call(pmin, c(data[-1], na.rm = TRUE)))
答案 1 :(得分:2)
使用基础R ......
data$mycol <- apply(data[,2:4], 1, function(x) x[!is.na(x)][1])
data
a x y z mycol
1 A 1 NA NA 1
2 B 2 NA NA 2
3 C NA 3 NA 3
4 D NA NA 4 4
5 E NA NA 5 5
6 F NA NA NA NA