R语言按suitcases分组筛选objects列恰好出现2次的重复行
问题原因
你原来的代码存在3个核心问题,完全不匹配需求:
- 没有按
suitcases字段分组,忽略了objects编号按行李箱重置的规则,会跨行李箱错误统计重复值 add_count(!sym(var))的写法会把除objects外的所有列(包括time.min、status这些无关字段)都作为重复判断的匹配维度,只要这些字段有差异就不会被判定为重复,完全不符合你仅匹配columns、rows的要求- 编写的for循环既没有正确遍历
suitcases的唯一取值,也没有存储每次循环的输出结果,运行后不会得到有效结果
解决方案
不需要写自定义函数+循环,直接用tidyverse的分组计数逻辑一步完成即可,核心判断规则是:在同一个suitcases分组下,columns、rows、objects三个字段值完全相同的行,出现次数恰好为2次就保留,出现1次或3次及以上都剔除。
完整代码如下:
library(tidyverse) # 处理你的Data表,直接运行即可得到结果 result <- Data |> # 按规则要求的维度分组:同行李箱、同行列位置、同object编号 group_by(suitcases, columns, rows, objects) |> # 统计每个分组的行数 add_count() |> # 仅保留出现恰好2次的分组 filter(n == 2) |> # 移除辅助计数的n列 select(-n) |> # 取消分组 ungroup()
示例数据验证
用你提供的示例结构数据运行上述代码,得到的结果完全符合预期:
- 保留
suitcases=3, rows=6, columns=3, objects=6对应的2行 - 保留
suitcases=10, rows=6, columns=3, objects=4对应的2行
其余行要么同分组下仅出现1次,要么匹配维度不一致,都会被剔除。
注意:如果你后续需要调整匹配规则,只需要修改
group_by()里的字段即可,比如要增加其他匹配字段直接往括号里加就行。
内容的提问来源于stack exchange,提问作者user19418711
相关产品推荐
相关产品推荐

