R:对具有一个匹配观察的个体的所有观察进行子集化

时间:2016-09-04 20:07:18

标签: r indexing subset

对不起另一个dang子集问题;我只是找不到这种情况描述,虽然它必须是常见的。简化的数据如下所示:

Plot     Year  BA
A        1980  44
A        1990  54
A        2000  66
B        1980  58
B        1990  69
B        2000  80

我想要所有关于任何BA&lt; 1980年50 - 在上面,所有三个A行。我理解subset(Df, BA<50 & Year==1980)但无法弄清楚下一级索引。

如果有人有更好的方式来标题,我会改变它。我想到的每一种搜索方式都只显示了&amp; / |的问题。 (这么多&amp; / |问题......)

3 个答案:

答案 0 :(得分:1)

Plot上为您的条件编制索引,在%in%检查成员身份,以防有多个Plot满足实际数据中的条件。

subset(df, Plot %in% unique(Plot[BA < 50 & Year == 1980]))
#   Plot Year BA
# 1    A 1980 44
# 2    A 1990 54
# 3    A 2000 66

或使用标准评估[子集,

df[with(df, Plot %in% unique(Plot[BA < 50 & Year == 1980])), ]
#   Plot Year BA
# 1    A 1980 44
# 2    A 1990 54
# 3    A 2000 66

答案 1 :(得分:1)

使用dplyr的另一个选项,这假设每个绘图只有一个等于1980的记录,否则您可能希望根据您的需要用all()any()包装条件逻辑:

library(dplyr)
df %>% group_by(Plot) %>% filter(BA[Year == 1980] < 50)

# Source: local data frame [3 x 3]
# Groups: Plot [1]

#     Plot  Year    BA
#   <fctr> <int> <int>
# 1      A  1980    44
# 2      A  1990    54
# 3      A  2000    66

在某些情节中存在多个1980的情况下,@ DirtySockSniffer的答案逻辑相当于df %>% group_by(Plot) %>% filter(any(BA[Year == 1980] < 50))中的dplyr

答案 2 :(得分:1)

我们可以使用data.table

library(data.table)
setDT(df1)[, if(all(BA[Year == 1980] < 50)) .SD, by = Plot]
#   Plot Year BA
#1:    A 1980 44
#2:    A 1990 54
#3:    A 2000 66