【问题标题】:R canonical dplyr way of replace if [duplicate]如果[重复],R规范的dplyr替换方式
【发布时间】:2019-09-14 14:04:26
【问题描述】:

假设你有:

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

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

df %>% mutate(c= a,
              c = replace(c, is.na(a), b[is.na(a)]))

但是(对我来说,只是我?)看起来很笨拙(从某种意义上说,我必须拼出 is.na(a) 两次)。这更容易:

df %>%
   rowwise() %>% 
   mutate(c = a,
          c = replace(c, is.na(a), b]))

但它需要额外的rowwise() 命令,我可以想象我的mutate 语句的总和不会按行工作的情况。

我是否遗漏了一些 dplyr 功能,使这(非常常见的任务?)变得更容易?

【问题讨论】:

  • 一个简单的ifelsedf %>% mutate(c = ifelse(is.na(a), b, a))

标签: r dplyr


【解决方案1】:

为此,您可以使用来自dplyrcoalesce()

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

   a  b c
1  1 NA 1
2  2  1 2
3 NA  2 2

来自文档:

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

或者如果你想在整个df上应用它:

df %>%
 mutate(c = coalesce(!!!.))

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2016-03-21
    • 1970-01-01
    • 2018-07-18
    • 2021-03-22
    相关资源
    最近更新 更多