【问题标题】:Select first non-NA value by row [duplicate]按行选择第一个非NA值[重复]
【发布时间】:2021-05-27 02:03:07
【问题描述】:

我有这样的数据:

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 函数,但我不太确定如何执行此操作。

【问题讨论】:

  • (无需为缺乏经验而道歉!第一个问题很好,顺便说一句。)

标签: r multiple-columns na missing-data


【解决方案1】:

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) 的优势在于,如果没有非 NA 元素,head 将返回 NULL,而 .[1] 将始终返回至少一个 NA(表示你认为这是唯一的选择)。

【讨论】:

  • 附注:如果 OP 对非base 感到满意:data.table::fcoalesce 采用 data.frame,因此可以在不输入所有单独列的情况下执行 df$E = fcoalesce(df[-1])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
相关资源
最近更新 更多