R:合并忽略NAs的列

R:合并忽略NAs的列,r,R,我有一个包含几列的数据框架,其中每行只有一列可以具有非NA值。我想将这些列合并为一个列,只保留非NA值,类似于本文: 但是,在我的例子中,有些行可能只包含NAs,因此在合并列中,我们应该保留一个NA,如下所示(改编自我提到的帖子): 我想得到 'a' 'mycol' A 1 B 2 C 3 D 4 E 5 F NA 由于F行的原因,上述帖子的解决方案在我的案例中不起作用,它是: cbind(data[1], mycol

我有一个包含几列的数据框架,其中每行只有一列可以具有非NA值。我想将这些列合并为一个列,只保留非NA值,类似于本文:

但是,在我的例子中,有些行可能只包含NAs,因此在合并列中,我们应该保留一个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])))

谢谢

一个选项是从
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
from
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

或者仅使用
行和

v1 <- rowSums(data[-1], na.rm = TRUE)
cbind(data[1], mycol = v1 * NA^!v1)
pmin

cbind(data[1], mycol = do.call(pmin, c(data[-1], na.rm = TRUE)))
使用基本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

data$mycol您能否指定用于syms功能的软件包?我看到不同的包具有相同名称的函数。
cbind(data[1], mycol = do.call(pmax, c(data[-1], na.rm = TRUE)))
cbind(data[1], mycol = do.call(pmin, c(data[-1], na.rm = TRUE)))
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