【问题标题】:How to replace all values using dplyr's across function [duplicate]如何使用dplyr的跨函数替换所有值[重复]
【发布时间】:2020-12-10 12:26:59
【问题描述】:

我之前使用dplyr 中的mutate_all 函数来替换我的数据框中的值。我正在尝试更新我的代码以适应新的跨函数,但我不确定如何更新它以便它可以执行替换功能。

下面是一个示例数据集。

df$A <- c(10,0,0,0,0,0,12,12,0,14,-99,14,-99,-99,16,16)
df$B <- c(10,0,0,0,12,12,12,12,0,14,-99,14,16,16,16,16)
df$C <- c(10,12,14,16,10,12,14,16,10,12,14,16,10,12,14,16)

  A   B  C
 10  10 10
  0   0 12
  0   0 14
  0   0 16
  0  12 10
  0  12 12
 12  12 14
 12  12 16
  0   0 10
 14  14 12
-99 -99 14
 14  14 16
-99  16 10
-99  16 12
 16  16 14
 16  16 16

我之前用来替换某个值(在本例中为-99)的代码如下,并且成功。

df %>% mutate_all(funs(replace(., .== -99, "Removed")))

      A       B  C
     10      10 10
      0       0 12
      0       0 14
      0       0 16
      0      12 10
      0      12 12
     12      12 14
     12      12 16
      0       0 10
     14      14 12
Removed Removed 14
     14      14 16
Removed      16 10
Removed      16 12
     16      16 14
     16      16 16

下面是我如何尝试为everything 实现across 函数(这用我想要的替换值替换了数据框中的所有单元格;不仅仅是-99 的实例)。

df %>% mutate(across(everything(), replace, -99 , "Removed"))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    使用:

    library(dplyr)
    df %>% mutate(across(everything(), ~replace(., . ==  -99 , "Removed")))
    

    across.cols 参数默认为 everything(),所以这也可以。

    df %>% mutate(across(.fns = ~replace(., . ==  -99 , "Removed")))
    

    然而,最简单的是:

    df[df == -99] <- 'Removed'
    

    【讨论】:

    • 感谢 Ronak 提供这些解决方案。我很好奇为什么在这种情况下需要 ~ 而在使用 ~ 实现其他函数时会导致函数不运行。我可以举一个例子,这很好用: df %>% mutate(across(everything(), na_if, -99)) 但这个例子没有: df %>% mutate(across(everything(), ~ na_if, -99))
    • 有不同的方法可以调用函数 ~ 用于当您想使用公式表示法调用函数时。 across(everything(), na_if, -99) 不使用它。如果要使用公式表示法,请使用across(everything(), ~na_if(., -99))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2020-10-08
    • 1970-01-01
    • 2020-11-11
    • 2019-11-29
    • 2017-03-08
    • 2017-04-22
    相关资源
    最近更新 更多