У меня есть фрейм данных, подобный следующему:
ID <- c(1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5)
Type <- c('A','B','C','B', 'C','A','B', 'C','A','C', 'C')
Value <- c(10, 11, 12, 1, 2, 100, 101, 102, -1, -2, -10)
df <- data.frame(ID, Type, Value)
Моя цель - фрейм данных, в котором для каждого идентификатора есть только одна строка. Но я хотел бы выбрать строки на основе определенных критериев/принципа водопада.
Поэтому предпочтительнее тип A, затем тип B, затем тип C. Моя цель - следующий фрейм данных:
ID <- c(1, 2, 3, 4, 5)
Type <- c('A','B','A','A', 'C')
Value <- c(10, 1, 100, -1, -10)
df_goal <- data.frame(ID, Type, Value)
Я думал о том, чтобы перейти к широкому формату, а затем использовать dplyr::coalesce
, но тогда я потерял бы колонку «Тип». Я почти уверен, что есть решение с использованием dplyr::group_by
и dplyr::summarise
. Изначально я также думал об использовании dplyr::if_else
в выражении dplyr::filter
, но я думаю, что это невозможно.
Любая помощь приветствуется!
На самом деле это вовсе не A, B, C. Но решение с slice_min
все равно работает, так как я могу создать фиктивную переменную.
В dplyr
используйте slice_min
, который по умолчанию фильтрует минимальное значение по группе, упорядоченной по переменной (здесь Type
, которая отсортирована в алфавитном порядке).
library(dplyr)
df %>%
group_by(ID) %>%
slice_min(Type)
# A tibble: 5 × 3
# Groups: ID [5]
ID Type Value
<dbl> <chr> <dbl>
1 1 A 10
2 2 B 1
3 3 A 100
4 4 A -1
5 5 C -10
В базе R:
df[with(df, Type == ave(Type, ID, FUN = min)), ]
решение data.table
library(data.table)
setDT(df) # make it a data.table if it is not yet
setkey(df, Type) # set the key on Type
df[, .SD[1L], by = ID] # subset the first value per ID
# ID Type Value
# 1: 1 A 10
# 2: 3 A 100
# 3: 4 A -1
# 4: 2 B 1
# 5: 5 C -10
Или df[, .SD[which.min(Type)], by = ID]
Конечно, это работает, но это становится ужасно медленным на больших наборах данных по сравнению с установкой ключа и прямым получением первого.
Всегда ли отношение предпочтения выражается в алфавитном порядке, или у вас может быть случай, когда K предпочтительнее J?