首页 > 解决方案 > 仅取 R 中数据框所有列的重复 ID 的最大值

问题描述

我有 24525 行和 22 列的数据框。最后一列是 ID 列,其他是数字。唯一 ID 的数量为 18414,并且某些 ID 重复了 2 次以上。

我需要删除重复的 ID,并只保留另一个数据框中每个 ID 和每一列的最大值。

我尝试在 for 循环中对每一列进行排序并删除重复项以保持最大值,但它不起作用,我不确定。

有谁知道完成这项任务的方法?

先感谢您

标签: rdplyrdata.tabletidyr

解决方案


假数据:

mt <- mtcars
mt$cyl <- as.character(mt$cyl)

碱基R

aggregate(. ~ cyl, data = mt, FUN = max)
#   cyl  mpg  disp  hp drat    wt  qsec vs am gear carb
# 1   4 33.9 146.7 113 4.93 3.190 22.90  1  1    5    2
# 2   6 21.4 258.0 175 3.92 3.460 20.22  1  1    5    6
# 3   8 19.2 472.0 335 4.22 5.424 18.00  0  1    5    8

(感谢@GregorThomas 对此的调整。)

tidyverse

library(dplyr)
mt %>%
  group_by(cyl) %>%
  summarize_all(max)
# # A tibble: 3 x 11
#   cyl     mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
#   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 4      33.9  147.   113  4.93  3.19  22.9     1     1     5     2
# 2 6      21.4  258    175  3.92  3.46  20.2     1     1     5     6
# 3 8      19.2  472    335  4.22  5.42  18       0     1     5     8

更新:正如@a​​krun 所建议的,dplyr::summarize_all已被取代。来自?summarize_all

范围动词(_if, _at, _all)已被across()现有动词中的使用所取代。详情请参阅vignette("colwise")

更新代码:

mt %>%
  group_by(cyl) %>%
  summarize(across(everything(), max))
# # A tibble: 3 x 11
#   cyl     mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
#   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 4      33.9  147.   113  4.93  3.19  22.9     1     1     5     2
# 2 6      21.4  258    175  3.92  3.46  20.2     1     1     5     6
# 3 8      19.2  472    335  4.22  5.42  18       0     1     5     8

数据表

library(data.table)
setDT(mt)
mt[, lapply(.SD, max), by=.(cyl)]

推荐阅读