【问题标题】:Remove duplicates based on two columns, keep one with a larger value on third column while keeping all columns intact [duplicate]根据两列删除重复项,在第三列保留一个具有较大值的列,同时保持所有列不变[重复]
【发布时间】:2021-11-01 13:37:07
【问题描述】:

我有一个如下的数据框:

x1    x2    x3    x4
X     A     B     4
Y     C     B     2
Z     A     C     1
X     C     B     5

我想根据 x2 和 x3 列的值删除这些重复的行。将保留 x4 列上具有较大值的那个。所以在这种情况下,结果将如下:

x1    x2    x3    x4
X     A     B     4
Z     A     C     1
X     C     B     5

第二行被删除,因为 (C, B) 对出现了两次,第四行被保留,因为 5 > 2 在 x4 列上。

我有以下代码似乎可以正确删除重复项,但最终结果中没有保留 x1 列:

result <- df%>%group_by(x2, x3)%>%summarise(x4=max(x4))

x2    x3    x4
A     B     4
A     C     1
C     B     5

如何将所有列 x1 ... x4 保留在最终结果中?

【问题讨论】:

  • 在引用的重复链接中也没有提供两个班轮:这里我们不取消分组:library(dplyr) df %&gt;% arrange(desc(x4)) %&gt;% distinct(x2,x3, .keep_all = TRUE)

标签: r dataframe dplyr tidyverse


【解决方案1】:

您可以按 x2 和 x3 分组并使用slice(),即

library(dplyr)

df %>% 
 group_by(x2, x3) %>% 
 slice(which.max(x4))

# A tibble: 3 x 4
# Groups:   x2, x3 [3]
  x1    x2    x3       x4
  <chr> <chr> <chr> <int>
1 X     A     B         4
2 Z     A     C         1
3 X     C     B         5

【讨论】:

  • 现在还有dplyr::slice_max
【解决方案2】:
library(dplyr)

df %>% 
  group_by(x2,x3) %>% 
  filter(x4 == max(x4)) 

# A tibble: 3 x 4
# Groups:   x2, x3 [3]
  x1    x2    x3       x4
  <chr> <chr> <chr> <int>
1 X     A     B         4
2 Z     A     C         1
3 X     C     B         5

Sotos 的答案更简洁,但这是另一种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 2020-01-15
    • 2010-11-29
    • 1970-01-01
    • 2018-03-24
    • 2022-06-27
    • 2021-12-29
    相关资源
    最近更新 更多