我有一个包含两列id
和value
的数据框,并且有超过100k的观测值。
大约有1000个不同的ID。
我想创建两个新数据框,它们的数据与原始数据框的数据相同,但各行根据以下条件进行排序。
对于一个数据帧,如果两行r1
和r2
分别具有ID id1
和id2
,并且行数为id = id1
小于id = id2
的数目或行数,则r1
应该出现在r2
之前。
对于另一个数据帧,如果两行r1
和r2
的ID为id1
和id2
,并且一行的最大value
具有{当id = id1
应该出现在id = id2
之前时,{1}小于行r1
的最大值。
根据列的聚合函数定义了这两种排序,因此创建这种排序的解决方案将允许创建更多的排序类。
如何在R中有效地建立这样的顺序?
编辑: 这是我的代码,它可以工作,但是又慢又长。我想知道是否有更聪明,更快捷的方法。
r2
答案 0 :(得分:1)
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)