Select 行的第一个非 NA 值

Select first non-NA value by row

我有这样的数据:

df <- data.frame(id=c(1, 2, 3, 4), A=c(6, NA, NA, 4), B=c(3, 2, NA, NA), C=c(4, 3, 5, NA), D=c(4, 3, 1, 2))

   id A  B  C D
1  1  6  3  4 4
2  2 NA  2  3 3
3  3 NA NA  5 1
4  4  4 NA NA 2

对于每一行:如果该行在“A”列中有非 NA 值,我希望将该值输入到新列 'E' 中。如果没有,我想转到“B”列,然后将该值输入到 E 中。依此类推。因此,新列将是 E = c(6, 2, 5, 4).

我想使用 ifelse 功能,但我不太确定该怎么做。

整洁宇宙

library(dplyr)
mutate(df, E = coalesce(A, B, C, D))
#   id  A  B  C D E
# 1  1  6  3  4 4 6
# 2  2 NA  2  3 3 2
# 3  3 NA NA  5 1 5
# 4  4  4 NA NA 2 4

coalesce 实际上是 "return 每个向量中的第一个非 NA"。它有一个 SQL 等价物(或者它相当于 SQL 的 COALESCE,实际上)。

基础 R

df$E <- apply(df[,-1], 1, function(z) na.omit(z)[1])
df
#   id  A  B  C D E
# 1  1  6  3  4 4 6
# 2  2 NA  2  3 3 2
# 3  3 NA NA  5 1 5
# 4  4  4 NA NA 2 4

na.omit 删除所有 NA 值,并且 [1] 确保我们始终 return 只是第一个 他们。 [1] 优于(比方说)head(., 1) 的优势在于,如果没有非 NA 元素,head 将 return NULL,而 .[1] 将始终 return 至少一个 NA (向您表明这是唯一的选择)。