微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

按行选择第一个非 NA 值

如何解决按行选择第一个非 NA 值

我有这样的数据:

df <- data.frame(id=c(1,2,3,4),A=c(6,NA,B=c(3,NA),C=c(4,5,D=c(4,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,4)

我想使用 ifelse 函数,但我不太确定如何执行此操作。

解决方法

tidyverse

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] 确保我们总是只返回第一个[1] 相对于(比如说)head(.,1) 的优势在于,如果没有非head 元素,NULL 将返回 NA,而 .[1]将始终至少返回一个 NA(向您表明这是唯一的选择)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。