【问题标题】:Conditional replacement using dplyr's mutate_all使用 dplyr 的 mutate_all 进行条件替换
【发布时间】:2016-10-24 16:58:34
【问题描述】:
library(tidyverse)
mytbl <- tibble(a = rep(c(1,1,0,1), 4), b= rep(c(1,0,0,1), 4))

    # A tibble: 16 × 2
           a     b
       <dbl> <dbl>
    1      1     1
    2      1     0
    3      0     0
    4      1     1
    5      1     1
    6      1     0
    7      0     0
    8      1     1
    9      1     1
    10     1     0
    11     0     0
    12     1     1
    13     1     1
    14     1     0
    15     0     0
    16     1     1

如果我以第二列为条件,一切都很好

dplyr::mutate_all(mytbl, funs(replace(., b != 0, NA)))

    # A tibble: 16 × 2
           a     b
       <dbl> <dbl>
    1     NA    NA
    2      1     0
    3      0     0
    4     NA    NA
    5     NA    NA
    6      1     0
    7      0     0
    8     NA    NA
    9     NA    NA
    10     1     0
    11     0     0
    12    NA    NA
    13    NA    NA
    14     1     0
    15     0     0
    16    NA    NA

但如果我以第一列为条件,则仅替换第一列

dplyr::mutate_all(mytbl, funs(replace(., a != 0, NA)))

    # A tibble: 16 × 2
           a     b
       <dbl> <dbl>
    1     NA     1
    2     NA     0
    3      0     0
    4     NA     1
    5     NA     1
    6     NA     0
    7      0     0
    8     NA     1
    9     NA     1
    10    NA     0
    11     0     0
    12    NA     1
    13    NA     1
    14    NA     0
    15     0     0
    16    NA     1

我确信我的方法做错了,我当然可以用非 dplyr 的方式来做这件事,但看起来这应该可行。您可以使用更多列来扩展它以获得类似的结果。

【问题讨论】:

  • 这看起来很奇怪。试试if_else,即mytbl %&gt;% mutate_all(funs(if_else(a!=0, ., NA_real_)))
  • 这确实很奇怪。 ifelse 没有这种行为,所以如果您只想让它工作,@akrun 可以满足您的需求。然而,这种行为真的很奇怪。如果我使用select 来反转列顺序,则错误会反转,因此,这是列顺序的问题。如果我使用mutate_each( ..., everything() ),我会遇到同样的问题,但如果我使用mutate_each( ..., b),它会在b 列中正确分配NAs。我希望我能给你一个更好的答案,但我不知道发生了什么。

标签: r dplyr


【解决方案1】:

我认为(但没有证据;))这是因为 a 被更改,然后重新检查条件。所以当你这样做时

dplyr::mutate_all(mytbl, funs(replace(., a != 0, NA)))

a 发生突变(因此它不再包含非零值) - 然后条件 a != 0 被重新评估但永远不会返回 TRUE。如果您将其更改为例如

dplyr::mutate_all(mytbl, funs(replace(., a > 0, 10)))

它将提供所需的行为。你可以试试

dplyr::mutate_all(mytbl, funs(replace(., mytbl$a != 0, NA)))

它不会“即时”更新a 列,因此会给出所需的结果。

【讨论】:

    猜你喜欢
    • 2020-04-03
    • 2017-05-09
    • 2016-06-07
    • 2018-10-27
    • 1970-01-01
    • 2014-04-15
    • 2017-09-20
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多