r - 在R中查找数据框的分组变量的交集
问题描述
我有一个这样的数据框:
df <- data.frame(
names = c(rep("cody", 10), rep("sam", 5)),
year = c(paste0("year",2000:2009), paste0("year",2000:2004))
)
我想得到这样的输出:
df2 <- data.frame(
names = c(rep("cody", 5), rep("sam", 5)),
year = c(paste0("year",2000:2004), paste0("year",2000:2004))
)
有任何想法吗?
解决方案
Reduce
这是一个带有和的基本 R 方法intersect
。
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")
推荐阅读
- java - 读取包含无符号数的二进制流
- python - Airflow - 为 DockerOperator 获取并清理 run_id
- pycharm - 如何为 pycharm 和 spyder 设置站点包目录?
- python - 如何从下一个名称中减去存储在 python 列表中的列名?
- vba - 在 Access CSV 导出顶部附加其他行
- javascript - 多个地址自动完成字段?(#Google Places API & getElementById #)
- deep-learning - 如何在 Pytorch 中分别连接两个大小为 [B,C,13,18] 和 [B,C,14,18] 的张量?
- java - 如何模拟任务:Spring中的执行者
- java - 带有 GeoTools 和 Shapefile 的 Geocoder 产生的 java.lang.NullPointerException
- oracle - SSIS - Oracle 视图导入不可见