我正在尝试修改由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
然而,它不起作用:我收到以下错误消息:
“z%中的错误&gt;%过滤器(w ==”a“&amp; x == 3)%&gt;%select(y)&lt; - NA:不可能发生故障”%&gt;%&lt ; - “
我知道我可以使用旧的data.frame表示法,但dplyr的解决方案是什么?
谢谢!
答案 0 :(得分:9)
过滤将对数据框进行子集化。如果您想保留整个数据框,但要修改其中的一部分,则可以使用mutate
和ifelse
。我已将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))
w x y 1 a 1 a 2 a 2 9 3 a 3 c 4 b 4 d 5 c 5 e
或replace
:
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
答案 1 :(得分: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
我确定基地R也有办法,但我不知道。特别是,我无法merge
或match
来完成这项工作。