【问题标题】:R How to mutate a subset of rowsR如何改变行的子集
【发布时间】:2015-07-02 09:10:48
【问题描述】:

我在更改 dplyr 中的行子集时遇到问题。我正在使用链接命令:%>% 说:

data <- data %>%
  filter(ColA == "ABC") %>%
  mutate(ColB = "XXXX")

这很好用,但问题是我希望能够选择整个原始表并查看仅应用于我指定的数据子集的变异。我的问题是,当我在此之后查看数据时,我只能看到 data 的子集及其更新的 ColB 信息。

我也想知道如何使用data.table 来做到这一点。

谢谢。

【问题讨论】:

标签: r data.table subset dplyr


【解决方案1】:

另一种选择是使用相同的数据执行联合和反连接的后续组合。这需要一个主键:

data <- data %>%
  filter(ColA == "ABC") %>%
  mutate(ColB = "XXXX") %>%
  rbind_list(., anti_join(data, ., by = ...))

例子:

mtcars_n <- mtcars %>% add_rownames
mtcars_n %>%
  filter(cyl > 6) %>%
  mutate(mpg = 1) %>%
  rbind_list(., anti_join(mtcars_n, ., by = "rowname"))

这可能比任何其他方法都慢得多,但对于通过扩展现有管道获得快速结果很有用。

【讨论】:

    【解决方案2】:

    使用data.table,我们会这样做:

    setDT(data)[colA == "ABC", ColB := "XXXX"]
    

    并且值被修改就地,不像if-else,它会复制整个列来替换满足条件的那些行。

    我们通过引用将此 sub-assign 称为。您可以在new HTML vignettes 中了解更多信息。

    【讨论】:

    • 谢谢。这行得通。以及如何进行多个标准过滤器?我尝试了以下,但它似乎不是正确的语法。setDT(data)[(colA == "ABC") &amp; (colC =="DEF"), ColB := "XXXX"]
    • @user1991118 那 is 是正确的语法 - 也许你可以展示一个可重现的例子。我唯一能想到的可能是您打算使用| 而不是&amp;
    • 这确实是正确的语法。我使用了错误的变量。它正在工作。
    【解决方案3】:

    当您使用filter() 时,您实际上是在删除与您指定的条件不匹配的行,因此它们不会出现在最终数据集中。

    ColB 是否已存在于您的数据框中?如果是这样,

    data %>%
      mutate(ColB = ifelse(ColA == "ABC", "XXXX", ColB))
    

    ColA == "ABC" 时将ColB 更改为"XXXX" 并保持原样。如果ColB 尚不存在,则必须指定对ColA != "ABC" 所在行执行的操作,例如:

    data %>%
      mutate(ColB = ifelse(ColA == "ABC", "XXXX", NA))
    

    【讨论】:

      猜你喜欢
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多