对不起另一个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; / |问题......)
答案 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