我寻找这个问题的答案已经有一段时间了,但还没有找到这个确切的测试用例。如果这个问题在别的地方解决了,请接受我的道歉。
我有一个大型的数据data
的生物观测(大约250万行,~50栏),从政府的调查计划。重要的列是reg
(区域)、species
和year
(调查)。
我想对数据进行分类,只包含在每个地区每年至少发现一次的物种。(我还需要对每年被发现至少10次的物种这样做,但我认为解决方案是一样的。)
换句话说,我只需要过滤出species
每年都存在的行,而region
也存在--本质上,每个species
的unique(year)
与每个reg
的unique(year)
匹配的所有行。(只有9个区域,所以我当然可以将数据划分为9个数据,并重复9次过滤,但我希望有一个更优雅的解决方案,只使用dplyr
,我可以直接应用于data
。)
谢谢!
编辑:我按照@aichao的建议创建了一个模拟数据集。
> 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年没有出现。
发布于 2016-09-23 20:31:37
您可以在原始数据框架中创建一个表示区域+物种对的id
变量。
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
确定year
s的总数、每个species
存在多少个year
s以及在所有年份中都存在哪些物种。
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
。
filter(df, ids %in% df2$ids)
发布于 2016-09-22 22:32:57
只保留每一次在该地区调查时发现的物种
我们可以使用dplyr
执行以下操作
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)
备注:
group_by
reg
并创建一个列num.years.in.reg
,其中包含对该区域进行调查的unique
年数。group_by
reg
和species
,并且只保留在该区域中对species
进行调查的unique
年数等于该区域所调查的unique
年数的species
。在这里,first
只是从num.years.in.reg
中检索第一个值,因为它们对于组中的所有行都是相同的。num.years.in.reg
列并按reg
对result
进行排序。根据您发布的数据,result
是:
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
https://stackoverflow.com/questions/39649533
复制相似问题