2015-04-23 34 views
9

我在dplyr中变异行的子集时遇到问题。我现在用的链接命令:%>%说:R如何变异行的子集

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

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

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

谢谢。

回答

9

使用data.table,我们会做:

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

和值被修改就地,不像if-else,which'd复制整列,以取代只是那些排在条件满足。

我们将此转为作为参考。您可以在new HTML vignettes中阅读更多关于它的内容。

+0

谢谢。这工作。我该如何做一个多重标准过滤器?我尝试了以下,但它似乎并不是正确的语法.'setDT(data)[(colA ==“ABC”)&(colC ==“DEF”),ColB:=“XXXX”]' –

+0

@ user1991118 *是*正确的语法 - 也许你可以显示一个可重复的例子。我能想到的唯一可能就是你打算使用'|'代替'&'。 – eddi

+0

这确实是正确的语法。我使用了错误的变量。这是工作。 –

4

当您使用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)) 
0

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

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

这很可能比任何其他方法要慢得多,但有用通过扩展现有的管道立竿见影。