r - 根据列的聚合函数对数据框的行进行排序
问题描述
我有一个包含两列的数据框,id
以及value
超过 10 万个观察值。
大约有 1000 个不同的 id。
我想创建两个新数据框,它们的数据与原始数据框相同,但行按以下标准排序。
对于一个数据框,如果两行r1
和分别r2
有 idid1
和id2
,如果 的行数id = id1
小于 或 的行数id = id2
,则r1
应该出现在 之前r2
。
对于另一个数据框,如果有两行r1
和r2
有 idsid1
和一行的id2
最大值小于 一行的最大值,什么时候应该出现在前面。value
id = id1
id = id2
r1
r2
这两个排序是根据列的聚合函数定义的,因此创建这种排序的解决方案将允许创建更大的排序类别。
如何在 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]),]
解决方案
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)
推荐阅读
- javascript - 使用状态即时更新 UI
- ruby-on-rails - Ruby on Rails 捆绑安装错误
- php - 用PHP执行ruby cmd错误
- react-native - 如何使用 Jest & Enzyme 测试 mapDispatchToProps?
- node.js - 是否可以将 AWS Cognito 与 Node 一起使用?
- php - PHP删除功能不会重定向到标题位置,但会删除条目
- ios - 我在 xCode 模拟器上使用了“擦除所有内容和设置”,现在我的应用程序没有显示
- docker - 在没有作曲家的情况下运行多容器?
- ios - 为什么我的操作按钮不会出现在我的通知中?
- wpf - WPF用户控件属性更改不会触发事件?