在删除两个特定列中重复的行时,是否可以根据第三列优先保留重复行之一?
考虑以下示例:
# Example dataframe.
df <- data.frame(col.1 = c(1, 1, 1, 2, 2, 2, 3),
col.2 = c(1, 1, 1, 2, 2, 2, 2),
col.3 = c('b', 'c', 'a', 'b', 'a', 'b', 'c'))
# Output
col.1 col.2 col.3
1 1 b
1 1 c
1 1 a
2 2 b
2 2 a
2 2 b
3 2 c
Run Code Online (Sandbox Code Playgroud)
我想删除在col.1和中都col.2重复的行,同时始终保留具有的重复行col.3 == 'a',否则对保留的重复行没有偏好。在此示例的情况下,结果数据帧将如下所示:
# Output.
col.1 col.2 col.3
1 1 a
2 2 a
3 2 c
Run Code Online (Sandbox Code Playgroud)
感谢所有帮助!
我们可以先订购col.3并删除重复的商品,即
d1 <- df[with(df, order(col.3)),]
d1[!duplicated(d1[c(1, 2)]),]
# col.1 col.2 col.3
#3 1 1 a
#5 2 2 a
#7 3 2 c
Run Code Online (Sandbox Code Playgroud)
slice如果行数大于1,则可以选择按“col.1”、“col.2”和将“col.3”作为“a”的行进行分组,否则返回第一行
library(dplyr)
df %>%
group_by(col.1, col.2) %>%
slice(if(n() > 1) which(col.3 == 'a') else 1)
# A tibble: 3 x 3
# Groups: col.1, col.2 [3]
# col.1 col.2 col.3
# <dbl> <dbl> <fct>
#1 1 1 a
#2 2 2 a
#3 3 2 c
Run Code Online (Sandbox Code Playgroud)
或者另一种选择是按“col.1”、“col.2”分组,然后将“a”与“col.3”slice进行 ing 得到的索引match。如果存在nomatch,我们返回索引 1。
df %>%
group_by(col.1, col.2) %>%
slice(match("a", col.3, nomatch = 1))
# A tibble: 3 x 3
# Groups: col.1, col.2 [3]
# col.1 col.2 col.3
# <dbl> <dbl> <fct>
#1 1 1 a
#2 2 2 a
#3 3 2 c
Run Code Online (Sandbox Code Playgroud)