如何为dplyr过滤的data.frame赋值?

如何为dplyr过滤的data.frame赋值?,r,dplyr,R,Dplyr,我正在尝试修改dplyr过滤的data.frame,但我似乎不太明白我需要做什么。在下面的示例中,我尝试过滤数据帧z,然后为第三列指定一个新值——我给出了两个示例,一个是“9”,另一个是“NA” require(dplyr) z%过滤器(w==“a”&x==2)%>%选择(y) z%>%过滤器(w==“a”&x==2)%>%select(y)%select(y)过滤将对数据帧进行子集化。如果希望保留整个数据帧,但修改其中的一部分,例如,可以使用ifelse使用mutate。我已经在示例数据中添加

我正在尝试修改dplyr过滤的data.frame,但我似乎不太明白我需要做什么。在下面的示例中,我尝试过滤数据帧z,然后为第三列指定一个新值——我给出了两个示例,一个是“9”,另一个是“NA”

require(dplyr)
z%过滤器(w==“a”&x==2)%>%选择(y)

z%>%过滤器(w==“a”&x==2)%>%select(y)%select(y)过滤将对数据帧进行子集化。如果希望保留整个数据帧,但修改其中的一部分,例如,可以使用
ifelse
使用
mutate
。我已经在示例数据中添加了
stringsAsFactors=FALSE
,这样
y
将成为一个字符列

z <- data.frame(w = c("a", "a", "a", "b", "c"), x = 1:5, y = c("a", "b", "c", "d", "e"), 
                stringsAsFactors=FALSE)

z %>% mutate(y = ifelse(w=="a" & x==2, 9, y))
或用
替换

z %>% mutate(y = replace(y, w=="a" & x==2, 9),
             y = replace(y, w=="a" & x==3, NA)) 
wxy
1 a 1 a
2 a 2 9
3 a 3
4b 4d
5C5E

我的印象是,dplyr包在哲学上反对修改基础数据。对于此操作,您可能会发现data.table包更友好:

library(data.table)
z <- data.table(w = c("a", "a", "a", "b", "c"), x = 1:5, y = c("a", "b", "c", "d", "e"))
m <- data.table(w = c("a","a"), x = c(2,3), new_y = c("9", NA))

z[m, y := new_y, on=c("w","x")]


   w x  y
1: a 1  a
2: a 2  9
3: a 3 NA
4: b 4  d
5: c 5  e
库(data.table)

z您的
y
是一个字符列。将
9
赋值给它做什么?
replace
是一个类似的选项,链接很好:
z%>%mutate(y=y%>%replace(w==“a”&x==2,9)%%>%replace(w==“a”&x==3,NA))
您将通过链接而不是编写多个
mutate
参数来保存几个字符(只需要写两次
y
,我的意思是,就像在我的评论中一样),尽管它确实意味着在管道中构建管道。@Frank:我不会想到在变异函数中使用%>%:太棒了。@eipi10:感谢解决方案:优雅、清晰(特别是带有replace()的版本,认为ifelse()很有创意)。它应该集成在dplyr的标准文档中的某个地方。谢谢!谢谢!这是对i[j](我想)的一个非常有创造性的评价表示法。感谢您提供的数据。表:与R中的许多东西一样,当其他人这样做时,它看起来非常直观,但当一个人必须弄明白它时,它看起来却非常简单……是的,我同意您关于dplyr的哲学的评论。@user5是的,我非常喜欢合并两个数据的
X[Y]
表示法。表模仿了
X[Y]
将两个矩阵子集到基R中的符号。我一直使用这种
X[Y,v:=new\u v]
的“合并分配”语法。如果您感兴趣,介绍性的小插曲非常清楚:
z %>% mutate(y = replace(y, w=="a" & x==2, 9),
             y = replace(y, w=="a" & x==3, NA)) 
  w x    y
1 a 1    a
2 a 2    9
3 a 3 <NA>
4 b 4    d
5 c 5    e
library(data.table)
z <- data.table(w = c("a", "a", "a", "b", "c"), x = 1:5, y = c("a", "b", "c", "d", "e"))
m <- data.table(w = c("a","a"), x = c(2,3), new_y = c("9", NA))

z[m, y := new_y, on=c("w","x")]


   w x  y
1: a 1  a
2: a 2  9
3: a 3 NA
4: b 4  d
5: c 5  e