这是带有Reduce 和intersect 的基本R 方法。
dat[dat$year == Reduce(intersect, split(dat$year, dat$names)),]
返回
names year
1 cody year2000
2 cody year2001
3 cody year2002
4 cody year2003
5 cody year2004
11 sam year2000
12 sam year2001
13 sam year2002
14 sam year2003
15 sam year2004
在这里,我们使用Reduce 将参数(使用split 作为列表提供的每个名称的单独年份)重复提供给intersect,从而消除“不匹配”年份,直到您最终只得到那些适用于所有名称的年份。
请注意,年份变量必须是字符向量,而不是因子变量。
作为一个小的简化,您可以使用 with 来减少 dat$ 引用:
dat[with(dat, year == Reduce(intersect, split(year, names))),]
数据
dat <-
structure(list(names = c("cody", "cody", "cody", "cody", "cody",
"cody", "cody", "cody", "cody", "cody", "sam", "sam", "sam",
"sam", "sam"), year = c("year2000", "year2001", "year2002", "year2003",
"year2004", "year2005", "year2006", "year2007", "year2008", "year2009",
"year2000", "year2001", "year2002", "year2003", "year2004")),
.Names = c("names", "year"), row.names = c(NA, -15L), class = "data.frame")