提取所选列中的第一个非NA值。

huangapple go评论71阅读模式
英文:

Extract first not NA value from selected columns

问题

我想从一组列中提取第一个非 NA 值。 "第一个" 的定义是根据列的顺序。 示例:

library(tidyverse)

d1 <- tribble(~a, ~x, ~w, ~z,
              "s", NA, 1, 2,
              "m", 2, 3, 0,
              "k", 9, NA, NA,
              "o", NA, NA, 4,
              "z", NA, NA, NA)

这是一个不起作用的选项 - 因为它只提取了 2 和 9:

d1 %>%
  mutate(want = pmap_int(list(x, w, z), ~.x[!is.na(.x)][1]))

想要的结果是:1, 2, 9, 4, NA

英文:

I would like to extract the first non NA value from a set of columns. "First" is defined by the order of columns. Example:

library(tidyverse)

d1 &lt;- tribble(~a, ~x, ~w, ~z,
              &quot;s&quot;, NA, 1, 2,
              &quot;m&quot;, 2, 3, 0,
              &quot;k&quot;, 9, NA, NA,
              &quot;o&quot;, NA, NA, 4,
              &quot;z&quot;, NA, NA, NA)

That is a not working option - because it only extracts 2 & 9:

d1 %&gt;%
  mutate(want = pmap_int(list(x, w, z), ~.x[!is.na(.x)][1] ))

Want is: 1, 2, 9, 4, NA.

答案1

得分: 3

使用 dplyr::coalesce,您可以这样做:

library(tidyverse)

d1 |&gt; 
  mutate(want = coalesce(x, w, z))
#&gt; # A tibble: 5 &#215; 5
#&gt;   a         x     w     z  want
#&gt;   &lt;chr&gt; &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt;
#&gt; 1 s        NA     1     2     1
#&gt; 2 m         2     3     0     2
#&gt; 3 k         9    NA    NA     9
#&gt; 4 o        NA    NA     4     4
#&gt; 5 z        NA    NA    NA    NA
英文:

Using dplyr::coalesce you could do:

library(tidyverse)

d1 |&gt; 
  mutate(want = coalesce(x, w, z))
#&gt; # A tibble: 5 &#215; 5
#&gt;   a         x     w     z  want
#&gt;   &lt;chr&gt; &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt;
#&gt; 1 s        NA     1     2     1
#&gt; 2 m         2     3     0     2
#&gt; 3 k         9    NA    NA     9
#&gt; 4 o        NA    NA     4     4
#&gt; 5 z        NA    NA    NA    NA

huangapple
  • 本文由 发表于 2023年7月17日 13:53:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/76701795.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定