将多个 columns/variables 组合成一个列

Combining multiple columns/variables into a single column

我有以下问题(我想有一个简单的答案,但我想不通...)。

我想将多列合并为一列。我有 3 个变量,有回答变量 1 的案例、回答变量 2 的案例、回答变量 3 的案例和回答 none 个变量的案例。

现在,我想将它们全部合并到一个变量中,看起来像列 vx:

Ideal result: 

  v1 v2 v3 vx
1   1 NA NA  1
2   3 NA NA  3
3   6 NA NA  6
4  NA  5 NA  5
5  NA  1 NA  1
6  NA  3 NA  3
7  NA NA  4  4
8  NA NA  2  2
9  NA NA  1  1
10 NA NA NA NA

v1 <- c(1, 3, 6, NA, NA, NA, NA, NA, NA, NA)
v2 <- c(NA, NA, NA, 5, 1, 3, NA, NA, NA, NA)
v3 <- c(NA, NA, NA, NA, NA, NA, 4, 2, 1, NA)

df <- data.frame(v1, v2, v3)

我用 df$vx <- paste(df$v1, df$v2, df$v3) 尝试过,但我得到以下结果:

My result: 

 v1 v2 v3       vx
1   1 NA NA  1 NA NA
2   3 NA NA  3 NA NA
3   6 NA NA  6 NA NA
4  NA  5 NA  NA 5 NA
5  NA  1 NA  NA 1 NA
6  NA  3 NA  NA 3 NA
7  NA NA  4  NA NA 4
8  NA NA  2  NA NA 2
9  NA NA  1  NA NA 1
10 NA NA NA NA NA NA

有人能告诉我如何在没有 NAs 的情况下得到像上面那样的结果(理想结果)(除非只有 NAs 那么我想只有一个 NA 在列 vx)

我希望我说清楚我的问题是什么。

非常感谢!

这就是 dplyr::coalesce 的用途:

library(dplyr)
df$v4 <- coalesce(!!!df)

#Also works:
df %>% 
  mutate(v4 = coalesce(v1, v2, v3))

输出

   v1 v2 v3 v4
1   1 NA NA  1
2   3 NA NA  3
3   6 NA NA  6
4  NA  5 NA  5
5  NA  1 NA  1
6  NA  3 NA  3
7  NA NA  4  4
8  NA NA  2  2
9  NA NA  1  1
10 NA NA NA NA

使用apply()

# Your data.
v1 = c(1, 3, 6, NA, NA, NA, NA, NA, NA, NA)
v2 = c(NA, NA, NA, 5, 1, 3, NA, NA, NA, NA)
v3 = c(NA, NA, NA, NA, NA, NA, 4, 2, 1, NA)

df = data.frame(v1, v2, v3)
df

# Solution: writing a function to be passed in apply().
useful.function = function(x)
{
  # The input "x" is a row of a dataframe.
  
  # If all the values are NA, return NA.
  if(sum(!is.na(x)) == 0)
    return(NA)
  
  # Otherwise, return the non-NA value.
  return(x[!is.na(x)])
}

df$vx = apply(df, MARGIN = 1, useful.function)
df

显然,其他解决方案可能更快并且需要更少的编码(因为那些依赖于 dplyr 包的解决方案,由@Maël 发布)。但是,我真的建议您自信地使用 apply() 和同一系列的其他函数(参见 lapply()sapply()),因为它们非常灵活(有时您可能不请注意某个功能或包的存在)。

在基础 R 中使用 max.col -

df$vx <- df[cbind(1:nrow(df), max.col(!is.na(df)))]
df

#   v1 v2 v3 vx
#1   1 NA NA  1
#2   3 NA NA  3
#3   6 NA NA  6
#4  NA  5 NA  5
#5  NA  1 NA  1
#6  NA  3 NA  3
#7  NA NA  4  4
#8  NA NA  2  2
#9  NA NA  1  1
#10 NA NA NA NA

max.col returns 每行最大值的索引。使用 !is.na(df) 我们将在每一行中获得 TRUE 值的索引,因为 TRUE > FALSE。我们用 cbind 创建一个矩阵以从每一行中提取最大值。