R如何改变行的子集

时间:2015-04-23 23:20:29

标签: r data.table subset dplyr

我无法改变dplyr中的行子集。我正在使用链接命令:%>%来说:

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

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

我还想知道如何使用data.table

感谢。

3 个答案:

答案 0 :(得分:9)

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

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

并且值就地修改,与if-else不同,后者会复制整个列以替换条件满足的那些行。

我们通过引用将此子分配称为。您可以在new HTML vignettes

中详细了解相关信息

答案 1 :(得分:5)

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

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

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

会将"XXXX"更改为ColA == "ABC",否则将其保留为ColB。如果ColA != "ABC"尚不存在,那么您必须为data %>% mutate(ColB = ifelse(ColA == "ABC", "XXXX", NA)) 的行指定要执行的操作,例如:

p

答案 2 :(得分:1)

另一个选择是使用相同的数据执行union和anti-join的后续组合。这需要一个主键:

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"))

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