【问题标题】:How can I assign new values to a selection in a pipe operator?如何为管道运算符中的选择分配新值?
【发布时间】:2021-02-26 07:53:08
【问题描述】:

我正在尝试学习 dplyr 包,但我不明白如何在管道操作中为选定的数据框分配新值。

编辑:我正在尝试用 NA 替换所有包含 10 的单元格。

例子:

new_df <- old_df %>%
  new_df$column1[grepl("10", new_df$column1)] <- NA

返回以下错误:

Error in old_df %>% new_df$column1[grepl("10", new_df$column1)] <- NA : could not find function "%>%<-"

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    a %&gt;% b(c),与 dplyr 无关,只是b(a, c) 的快捷方式。在您的代码中,这意味着编写

    new_df <- `[<-`(old_df, new_df$column1, grepl("10", new_df$column1), NA)
    

    (因为 R 中的 x[i] &lt;- vx &lt;- `[&lt;-`(x, i, value = v) 相同,其中 [&lt;- 是执行子集替换的函数的名称。)

    这显然是荒谬的。

    (错误信息有点误导,因为幕后实际发生的事情更加复杂。我们不需要详细剖析,因为这显然不是你的想法。)

    关键是你只能使用管道来代替最初解释的调用语法,而不是别的(不要试图把它放在任何地方)。不要试图强行将方形钉穿过圆孔。如果要替换某些值,请直接执行此操作:

    new_df <- old_df
    new_df$column1[grepl("10", new_df$column1)] <- NA
    

    或者使用 dplyr:

    new_df <- mutate(old_df, column1 = ifelse(grepl("10", column1), NA, column1))
    

    ...如果您愿意,现在可以用管道替换传统的函数调用语法,尽管它在这里并不能真正实现目的:

    new_df <- old_df %>% mutate(column1 = ifelse(grepl("10", column1), NA, column1))
    

    【讨论】:

    • 感谢您的精彩解释。我想在管道中这样做的原因是我不必重复地将它重新分配给同一个变量。这已经很清楚了。
    【解决方案2】:

    这里有两种可能的dplyr 解决方案,具体取决于问题的具体要求。

    首先,一些测试数据。

    old_df <- data.frame(column1 = as.character(c(5:15, 90:110)),
                         column2 = c(10:20, 90:110))
    

    1. 替换column1pattern“10”可以通过NA 找到的所有元素。

    old_df %>%
      mutate(column1 = ifelse(grepl("10", column1), NA, column1))
    

    2. 替换column1“10”可以通过NA 找到的所有元素。

    old_df %>%
      mutate(column1 = ifelse(column1 == "10", NA, column1))
    

    如果模式或值是数字,请删除引号。

    基础 R

    无论如何,base R 更适合这个问题。要将值替换为 NA,请使用基本函数 is.na&lt;-

    new_df <- old_df
    is.na(new_df$column1) <- grepl("10", new_df$column1)
    

    【讨论】:

    • 感谢您的解释,解决方案 1 是我正在寻找的解决方案。
    【解决方案3】:

    我相信您正在尝试用 NA 替换值 10。那是对的吗?如果是这样,

    new_df <- old_df %>%
      filter( column1 == "10" ) %>%
      mutate ( column1 = NA)
    

    现在将提供具有 10 个 NA 的数据子集。 但是由于您需要保留其余数据,

    new_df <- old_df %>%
      mutate ( column1 = ifelse((column1 == "10"), NA, column1))
    

    会有所帮助。

    【讨论】:

    • 现在你已经删除了所有值≠"10",这可能不是 OP 的想法。
    • 感谢您的帮助,我确实想用 10 替换这些值。当我插入 starts_with() 或 grepl() 函数时,它会清空整个数据框
    • 没错,他需要什么还不清楚。如果这不是他想要的,可能需要提供不同的解决方案。
    猜你喜欢
    • 2015-10-08
    • 2017-04-21
    • 2020-07-09
    • 2017-08-21
    • 1970-01-01
    • 2020-10-24
    • 2021-10-10
    • 2011-03-19
    • 1970-01-01
    相关资源
    最近更新 更多