【问题标题】:How to assign a value to a data.frame filtered by dplyr?如何为 dplyr 过滤的 data.frame 赋值?
【发布时间】:2016-08-23 19:44:14
【问题描述】:

我正在尝试修改由 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 %>% 过滤器中的错误(w == "a" & x == 3) %>% select(y) %

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

谢谢!

【问题讨论】:

  • 您的y 是一个字符列。你在为它分配9 做什么?

标签: r dplyr


【解决方案1】:

过滤将子集数据框。如果您想保留整个数据框,但修改其中的一部分,您可以使用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

【讨论】:

  • replace 是一个类似的选项,可以很好地链接:z %&gt;% mutate(y = y %&gt;% replace(w=="a" &amp; x==2, 9) %&gt;% replace(w == "a" &amp; x == 3, NA))
  • 您将通过链接而不是编写多个 mutate args 来节省一些字符(我的意思是,就像我的评论一样,只需要编写两次 y),尽管这确实意味着构建管道管道内。
  • @Frank:我不会想到在 mutate 函数中使用 %>%:bravo。
  • @eipi10:感谢您的解决方案:优雅、清晰(尤其是带有 replace() 的版本,认为 ifelse() 很有创意)。它应该集成在 dplyr 的标准文档中。谢谢!
【解决方案2】:

我的印象是 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

我确信在 base R 中也有办法,但我不知道。特别是,我无法让mergematch 完成这项工作。

【讨论】:

  • 谢谢!这是对 i[j](我认为)符号的一种非常有创意的方法。感谢 data.table:就像 R 中的许多东西一样,当其他人这样做时它看起来很直观,但当人们不得不弄清楚它时却是如此之少......是的,我同意你对 dplyr 哲学的评论。跨度>
  • @user5 是的,我真的很喜欢 X[Y] 用于合并两个 data.tables 的表示法如何模仿 X[Y] 表示法在基础 R 中对两个矩阵进行子集化。我使用这个 X[Y, v := new_v] "merge-一直分配”语法。如果你有兴趣,介绍性的小插曲很清楚:github.com/Rdatatable/data.table/wiki/Getting-started
猜你喜欢
  • 2020-12-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2014-04-16
相关资源
最近更新 更多