假设您有:
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使此操作(非常常见的任务)更容易的功能?
为此,您可以使用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)