r - R 仅删除一组重复项
问题描述
我查看了重复的答案,但找不到与此类似的案例。我只想删除一组的重复项并保持原样。这可以在不创建临时表的情况下实现吗?
例子:
我只想删除 ID == "B" 的重复项,我不在乎其他 ID 中是否有重复项。
library(dplyr)
dt <- tibble(ID = rep(LETTERS[1:3], 3),
VAL = rep(1:3, 3),
VAL2 = rep(1:3, 3)) %>%
arrange(ID)
我通常用来在两列中查找重复项。
dt %>%
group_by(ID) %>%
distinct(VAL, VAL2, .keep_all = T)
这当然会找到所有重复项,我可以使用过滤器并创建一个新表,然后从那里开始工作,但是寻找删除 ID == "B" 重复项而不触及其他 ID 的方法。这可以在不创建临时表的情况下实现吗?
我目前的工作流程
B <- dt %>%
filter(ID == "B") %>%
distinct(VAL, VAL2, .keep_all = T)
dt %>%
filter(ID != "B") %>%
bind_rows(B)
# A tibble: 7 x 3
ID VAL VAL2
<chr> <int> <int>
1 A 1 1
2 A 1 1
3 A 1 1
4 C 3 3
5 C 3 3
6 C 3 3
7 B 2 2
解决方案
您可以使用负子集来要求重复 for ID=="B"
。
i <- which(dt$ID == "B")
dt[-i[duplicated(dt[i,])],]
#dt[-i[duplicated(dt[i,c("VAL", "VAL2")])],] #Alternative limiting to VAL and VAL2
# ID VAL VAL2
# <chr> <int> <int>
#1 A 1 1
#2 A 1 1
#3 A 1 1
#4 B 2 2
#5 C 3 3
#6 C 3 3
#7 C 3 3
或者您可以rbind
在子设置后dt
使用unique
并在选定的行上使用。
i <- dt$ID == "B"
rbind(dt[!i,], unique(dt[i,]))
# ID VAL VAL2
# <chr> <int> <int>
#1 A 1 1
#2 A 1 1
#3 A 1 1
#4 C 3 3
#5 C 3 3
#6 C 3 3
#7 B 2 2
推荐阅读
- java - 如何从Java中的sql查询的列名中删除单引号
- php - php array_map 删除空数组
- json - 我的 Flutter 移动应用可以使用我的 Google Apps 脚本吗?
- r - 向量中的函数分配错误(R语言)
- javascript - 如何将 collectionGroup 查询结果限制为祖先?
- android - android.app.Application 无法转换为我的应用程序
- javascript - 在 Phaser 3 中运行动画不起作用
- java - ArrayList 类型中的方法 set(int, Int)
不适用于参数 (int, int) 长度无法解析或不是字段 - java - 是 scala OpenHashMap 删除运算符线程安全
- c - 如何将空字符传递给 c 获取函数?或用 \0 字符终止输入