【发布时间】:2018-06-18 15:48:46
【问题描述】:
我完全不知道如何根据多个字符串变量的值过滤重复项。可悲的是,我的数据集是私有的,但我可以用假数据一瞥它:
id = c(1, 1, 2, 2, 5, 6, 6)
car = c(0, 1, 1, 1, 1, 1, 1)
insurance = c("no", "yes", "yes", "yes", "no", "yes", "yes")
ins_type = c("", "liab", "liab", "full", "", "full", "liab")
df = data.frame(id, car, insurance, ins_type)`
构建这个data.frame:
id car insurance ins_type`
1 0 no
1 1 yes liab
2 1 yes liab
2 1 yes full
5 1 no
6 1 yes full
6 1 yes liab
地点:
a. id = person
b. car = 0 is NO and 1 is YES
c. insurance = whether or not that person has one, and
d, ins_type = liability or full
我需要删除所有重复的个人。我想要的数据集是:
- 在数据集中出现一次,无论是否拥有汽车;
- 拥有汽车的人,最好是拥有汽车的人;
- 有保险的话最好是那些;
- 有完整的保险。
即:
id car insurance ins_type
1 1 yes liab
2 1 yes full
5 1 no
6 1 yes full
请注意,5 必须保留,因为它只出现一次。删除了所有重复项。人 #1 有两个连接,但只有一个基于拥有车辆,所以保留了。
我有以下 dplyr 代码:
df = df %>%
group_by(id) %>%
filter(car == 1) %>%
filter(insurance == "yes") %>%
filter(ins_type == "full")
但这会导致:
id car insurance ins_type
2 1 yes full
6 1 yes full
我也试过
df %>% group_by(id, car) %>% distinct(insurance)
但这会导致
id car insurance
1 0 no
1 1 yes
2 1 yes
5 1 no
6 1 yes
第一行不应该在那里。
我对这个主题进行了广泛的搜索,并为“如何有条件地过滤重复行”这个问题找到了许多答案。其中大多数——例如this 和this——处理保留具有最高或最低值的行之一。其他人处理任意/随机过滤。我需要按照上面的逻辑。
非常欢迎任何见解。
编辑
以下所有答案都非常令人满意,并以自己的方式解决了问题。我投给了@storaged 的一票,因为我的问题解决方案的核心是使用因子级别来创建层次结构。感谢您的帮助和教导,希望有一天我能对您或社区有所帮助。
【问题讨论】:
-
你能添加你想要的输出吗?
-
我认为第四个框是所需的输出
-
ID 为 :- 1, 2, 5, 6 的那个?
-
@suchait:是的,这是第四个盒子。它保持: id=5,谁出现一次;湾。 id=1的第二个入口,就是有车的那个; C。 id=2 和 id=6 的条目是完全保险的汽车。谢谢。
-
您只需要 dplyr 中的解决方案,或者使用
data.table就可以了吗?
标签: r duplicates dplyr