【问题标题】:group by and filter data management using dplyr使用 dplyr 分组和过滤数据管理
【发布时间】:2015-06-24 12:35:11
【问题描述】:

取一个简单的数据集

a <- c(1,2,3,4,5,6,7,8)
b <- c(1,2,2,1,2,2,2,2)
c <- c(1,1,1,2,2,2,3,3)
d <- data.frame(a,b,c)

现在我想过滤我的数据,以便我们group_by(c),然后删除所有没有出现b=1的数据。

因此结果 (e) 应该看起来像 d 但没有底部的两行

我尝试过使用

e <- d %>%
  group_by(c) %>%
  filter(n(b)>1)

输出应该包含下面绿色的数据并删除红色的数据

【问题讨论】:

  • e &lt;- d %&gt;% group_by(c) %&gt;% filter( !b == 1)
  • !b == 1 等于 b != 1 可能更具可读性?
  • 不完全是,所以我想删除每个唯一的“c”行,其中每个“c”身份没有“b==1”
  • 这也不起作用e &lt;- d %&gt;% group_by(c) %&gt;% filter( b == 1 &amp; b == 2 )
  • 不知道为什么以前没人这么说,但是你要找的函数是n_distinct,比如d %&gt;% group_by(c) %&gt;% filter(n_distinct(b)&gt;1)

标签: r dplyr


【解决方案1】:

试试

d %>% 
  group_by(c) %>% 
  filter(any(b == 1))

这给出了:

#Source: local data frame [6 x 3]
#Groups: c
#
#  a b c
#1 1 1 1
#2 2 2 1
#3 3 2 1
#4 4 1 2
#5 5 2 2
#6 6 2 2

【讨论】:

  • 太棒了。谢谢,什么是“任何”功能。它没有记录在cran.r-project.org/web/packages/dplyr/dplyr.pdf
  • @lukeg 这不是dplyr 包的一部分。 any() 在基数 R 中。来自?any给定一组逻辑向量,至少有一个值是真的吗?
  • 我有一个不同但相关的问题,并使用all() 解决了给定一组逻辑向量,所有值都为真
【解决方案2】:

你可以试试

df <- d %>% mutate(test = ifelse((b != 1) == T, 0, 1)) %>% group_by(c) %>% 
            mutate(test = sum(test)) %>% filter(test != 0) %>% select(-test)

产生

#  a b c
#1 1 1 1
#2 2 2 1
#3 3 2 1
#4 4 1 2
#5 5 2 2
#6 6 2 2

【讨论】:

  • 这似乎过于复杂了。为什么不链接所有操作?为什么你使用 mutate() 创建一些变量而使用 $ 创建一些变量?为什么要以ungroup() 结尾?
猜你喜欢
  • 2018-06-02
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 2017-05-06
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
相关资源
最近更新 更多