首页 文章

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

提问于
浏览
7

我正在尝试修改由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%>%filter的错误(w ==”a“&x == 3)%>%select(y)< - NA:不可能de trouver la fonction”%>%< - “

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

谢谢!

2 回答

  • 6

    过滤将对数据帧进行子集化 . 如果要保留整个数据框,但要修改其中的一部分,则可以使用 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))
    

    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

  • 9

    我的印象是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的一种方式,但是我没有't know it. In particular, I can'来获得 mergematch 来完成这项工作 .

相关问题