按行选择第一个非 NA 值

3

我有这样的数据:

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函数,但我不太确定如何做到这一点。

不需要为缺乏经验道歉!顺便说一句,这是一个好问题。 - r2evans
1个回答

1

整洁的宇宙

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 实际上是 "在每个向量中返回第一个非 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]确保我们总是返回它们中的第一个。与head(., 1)相比,[1]的优点在于,如果没有非NA元素,head将返回NULL,而.[1]将始终返回至少一个NA(向您指示它是唯一的选项)。

1
一点小提示:如果楼主不介意使用非“base”函数,那么可以使用data.table::fcoalesce函数来处理data.frame。这样就可以通过df$E = fcoalesce(df[-1])的方式来完成操作,而无需逐个输入每一列。 - Henrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接