如何为由dplyr过滤的data.frame分配值?

nul*_*art 10 r dplyr

我正在尝试修改由dplyr过滤的data.frame,但我似乎不太了解我需要做什么.在下面的例子中,我试图过滤数据框z然后为第三列分配一个新值 - 我举两个例子,一个带有"9",一个带有"NA".

require(dplyr)
z <- data.frame(w = c("a", "a", "a", "b", "c"), x = 1:5, y = c("a", "b", "c", "d", "e"))
z %>% filter(w == "a" & x == 2) %>% select(y) 
z %>% filter(w == "a" & x == 2) %>% select(y) <- 9 # Should be similar to z[z$w == "a" & z$ x == 2, 3] <- 9
z %>% filter(w == "a" & x == 3) %>% select(y) <- NA # Should be similar to z[z$w == "a" & z$ x == 3, 3] <- NA
Run Code Online (Sandbox Code Playgroud)

然而,它不起作用:我收到以下错误消息:

"z%>%filter中的错误(w =="a"&x == 3)%>%select(y)< - NA:不可能de trouver la fonction"%>%< - "

我知道我可以使用旧的data.frame表示法,但dplyr的解决方案是什么?

谢谢!

eip*_*i10 11

过滤将对数据帧进行子集化.如果你想保持整个数据帧,而修改它的一部分,你可以,例如使用mutateifelse.我已添加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))
Run Code Online (Sandbox Code Playgroud)
  w x y
1 a 1 a
2 a 2 9
3 a 3 c
4 b 4 d
5 c 5 e
Run Code Online (Sandbox Code Playgroud)

或者replace:

z %>% mutate(y = replace(y, w=="a" & x==2, 9),
             y = replace(y, w=="a" & x==3, NA)) 
Run Code Online (Sandbox Code Playgroud)
  w x    y
1 a 1    a
2 a 2    9
3 a 3 <NA>
4 b 4    d
5 c 5    e
Run Code Online (Sandbox Code Playgroud)

  • `replace`是一个类似的选项,很好地链接:`z%>%mutate(y = y%>%replace(w =="a"&x == 2,9)%>%replace(w =="a "&x == 3,NA))` (3认同)

Fra*_*ank 6

我的印象是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
Run Code Online (Sandbox Code Playgroud)

我确定基地R也有办法,但我不知道.特别是,我无法获得mergematch完成这项工作.