Сортировать строки фрейма данных по статистической функции столбцов - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть фрейм данных с двумя столбцами, id и value и более 100 000 наблюдений.

Существует около 1000 различных идентификаторов.

Я хотел бы создать два новых фрейма данных с теми же данными, что и исходный, но со строками, отсортированными по следующим критериям.

Для одного фрейма данных, если две строки r1 и r2 имеют идентификаторы id1 и id2 соответственно, и если число строк с id = id1 меньше числа или строк с id = id2, тогда r1 должно появиться до r2.

Для другого фрейма данных, если две строки r1 и r2 имеют идентификаторы id1 и id2, а максимальный value строки с id = id1 меньше максимального значения строка с id = id2, когда r1 должно появиться до r2.

Два порядка определены в соответствии с агрегатными функциями столбцов , поэтому решение для создания такого порядка позволило бы создать гораздо больший класс порядков.

Как я могу эффективно построить такие заказы в R?

EDIT: Это мой код, он работает, но он медленный и длинный. Интересно, есть ли более умный и быстрый способ сделать это?

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]),]

1 Ответ

0 голосов
/ 09 сентября 2018
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...