R规范dplyr替换方式

SAF*_*FEX 3 r dplyr

假设您有:

df = data.frame(a = c(1,2,NA),b = c(NA, 1,2))
> df
   a  b
1  1 NA
2  2  1
3 NA  2
Run Code Online (Sandbox Code Playgroud)

并希望基于a创建一个新列c。如果缺少a,则使用b。这有效:

df %>% mutate(c= a,
              c = replace(c, is.na(a), b[is.na(a)]))
Run Code Online (Sandbox Code Playgroud)

但是(对我来说,只有我吗?)看起来笨拙(就我而言,我必须拼出is.na(a)两次)。这比较容易:

df %>%
   rowwise() %>% 
   mutate(c = a,
          c = replace(c, is.na(a), b]))
Run Code Online (Sandbox Code Playgroud)

但是它需要额外的rowwise()命令,我可以想象到情景陈述中我的陈述之和mutate将无法按行工作。

我是否缺少一些dplyr使此操作(非常常见的任务)更容易的功能?

tmf*_*mnk 5

为此,您可以使用coalesce()from dplyr

df %>%
 mutate(c = coalesce(a, b))

   a  b c
1  1 NA 1
2  2  1 2
3 NA  2 2
Run Code Online (Sandbox Code Playgroud)

从文档中:

给定一组向量,coalesce()会找到每个位置的第一个非缺失值。

或者,如果您要将其应用于整个df:

df %>%
 mutate(c = coalesce(!!!.))
Run Code Online (Sandbox Code Playgroud)