首页 > 解决方案 > 根据列的聚合函数对数据框的行进行排序

问题描述

我有一个包含两列的数据框,id以及value超过 10 万个观察值。

大约有 1000 个不同的 id。

我想创建两个新数据框,它们的数据与原始数据框相同,但行按以下标准排序。

对于一个数据框,如果两行r1和分别r2有 idid1id2,如果 的行数id = id1小于 或 的行数id = id2,则r1应该出现在 之前r2

对于另一个数据框,如果有两行r1r2有 idsid1和一行的id2最大值小于 一行的最大值,什么时候应该出现在前面。valueid = id1id = id2r1r2

这两个排序是根据列的聚合函数定义的,因此创建这种排序的解决方案将允许创建更大的排序类别。

如何在 R 中有效地构建这样的排序?

编辑:这是我的代码,它可以工作,但它又慢又长。我想知道是否有更聪明、更快捷的方法。

library(hashmap)
a <- read.table(filename, header = T)
aggregate_values <- unlist(lapply(unique(a[[1]]), function(x) max(a[a[[1]] == x,2])))
id_to_aggregate_value <- hashmap(unique(a[[1]]), aggregate_values)
aggregate_values_columns <- id_to_aggregate_value[[a[[1]]]]
a <- cbind(a, aggregate_values_columns)
a <- a[order(a[,3]),]

标签: raggregate-functions

解决方案


library(dplyr)

# Make a similar table as yours with ~1000 ids and 100k rows
df <- tibble(
  id = rnorm(n = 1E5, mean = 1000, sd = 150) %>% as.integer(),
  value = runif(1E5, 500, 1500)
)

# How many unique id's? Should be around 1000...
length(unique(df$id))
[1] 1052     

# First question, show infrequent id's first
df_sort_by_id_freq <- df %>%
  add_count(id) %>%
  arrange(n, id)

# Second question, show id's with smallest max first
df_sort_by_max <- df %>%
  group_by(id) %>%
  mutate(id_max = max(value)) %>%
  arrange(id_max, id, value)

推荐阅读