我无法改变dplyr
中的行子集。我正在使用链接命令:%>%
来说:
data <- data %>%
filter(ColA == "ABC") %>%
mutate(ColB = "XXXX")
这很好但问题是我希望能够选择整个原始表并看到mutate只应用于我指定的数据子集。我的问题是,当我在此之后查看数据时,我只会看到data
的子集及其更新的ColB
信息。
我还想知道如何使用data.table
。
感谢。
答案 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"))
这比任何其他方法都慢得多,但通过扩展现有管道可以快速获得结果。