首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用dplyr通过多行和多列匹配设置数据帧

使用dplyr通过多行和多列匹配设置数据帧
EN

Stack Overflow用户
提问于 2016-09-22 22:00:23
回答 2查看 1.1K关注 0票数 2

我寻找这个问题的答案已经有一段时间了,但还没有找到这个确切的测试用例。如果这个问题在别的地方解决了,请接受我的道歉。

我有一个大型的数据data的生物观测(大约250万行,~50栏),从政府的调查计划。重要的列是reg (区域)、speciesyear (调查)。

我想对数据进行分类,只包含在每个地区每年至少发现一次的物种。(我还需要对每年被发现至少10次的物种这样做,但我认为解决方案是一样的。)

换句话说,我只需要过滤出species每年都存在的行,而region也存在--本质上,每个speciesunique(year)与每个regunique(year)匹配的所有行。(只有9个区域,所以我当然可以将数据划分为9个数据,并重复9次过滤,但我希望有一个更优雅的解决方案,只使用dplyr,我可以直接应用于data。)

谢谢!

编辑:我按照@aichao的建议创建了一个模拟数据集。

代码语言:javascript
运行
复制
> year = c(1999,2000,2000,2004,2004,2008)
> reg = c('ai','ci','ci','ai','ai','ci')
> species = c('blueei','greenei','yellowei','blueei','greenei','yellowei')
> df <- data.frame(year, reg, species)
> df
  year reg  species
1 1999  ai   blueei
2 2000  ci  greenei
3 2000  ci yellowei
4 2004  ai   blueei
5 2004  ai  greenei
6 2008  ci yellowei

因此,在这个df中,我只想保留每次对该地区进行调查时发现的物种(让我们假设这是完整的数据)。在ai,我想保留blueei --这在每一年的调查中都有发现--但不想保留greenei。同样,在ci,我希望保留yellowei,但不想保留greenei,因为greenei在2008年没有出现。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-23 20:31:37

您可以在原始数据框架中创建一个表示区域+物种对的id变量。

代码语言:javascript
运行
复制
 year = c(1999,2000,2000,2004,2004,2008)
 reg = c('ai','ci','ci','ai','ai','ci')
 species = c('blueei','greenei','yellowei','blueei','greenei','yellowei')

df <- data.frame(year, reg, species) %>%
 mutate(ids = paste(reg, species, sep='-'))

然后创建一个新的数据框架,为每个region确定years的总数、每个species存在多少个years以及在所有年份中都存在哪些物种。

代码语言:javascript
运行
复制
 df2 <- df %>%
 group_by(reg) %>%
 mutate(n_yrs = length(unique(year))) %>%
 group_by(reg, ids) %>%
 summarize(present_yrs = length(unique(year)),
         all_yrs     = mean(n_yrs, na.rm = T)) %>%
 filter(present_yrs == all_yrs)

最后,筛选旧的数据集,使其只包括df2中的df2

代码语言:javascript
运行
复制
filter(df, ids %in% df2$ids)
票数 1
EN

Stack Overflow用户

发布于 2016-09-22 22:32:57

只保留每一次在该地区调查时发现的物种

我们可以使用dplyr执行以下操作

代码语言:javascript
运行
复制
library(dplyr)
result <- df %>% group_by(reg) %>% mutate(num.years.in.reg = length(unique(year))) %>% 
                 group_by(reg,species) %>% filter(length(unique(year)) == first(num.years.in.reg)) %>%
                 select(-num.years.in.reg) %>% arrange(reg)

备注:

  1. 首先,group_by reg并创建一个列num.years.in.reg,其中包含对该区域进行调查的unique年数。
  2. 然后,group_by regspecies,并且只保留在该区域中对species进行调查的unique年数等于该区域所调查的unique年数的species。在这里,first只是从num.years.in.reg中检索第一个值,因为它们对于组中的所有行都是相同的。
  3. 删除num.years.in.reg列并按regresult进行排序。
  4. 注意,在过滤逻辑中,我们不需要比较唯一的年份值,只需要比较唯一年份的数量,因为第二个分组是第一个分组的子集。也就是说,独特的年份将是相同的,但在第二组中可能比第一组少。

根据您发布的数据,result是:

代码语言:javascript
运行
复制
print(result)
##Source: local data frame [4 x 3]
##Groups: reg, species [2]
##
##   year   reg  species
##  <dbl> <chr>    <chr>
##1  1999    ai   blueei
##2  2004    ai   blueei
##3  2000    ci yellowei
##4  2008    ci yellowei
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39649533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档