Я хочу выяснить, что является доминирующим классом каждого id_b . Чтобы вычислить его, мне нужно узнать сумму размер за класс для каждого id_b . Какой бы класс ни был наибольшим, это новый доминирующий класс, назначенный id_b.
Сценарий ниже делает то, что я хочу, но он выглядит довольно неуклюжим и слишком сложным. Я не очень много работал с вложенными данными, поэтому не уверен, что использовал самые лучшие методы. Кто-нибудь может придумать более удобный способ достижения того же результата в tidyverse или data.table?
Спасибо!
library(tidyverse)
# sample data
set.seed(123)
input <- tibble(id_a = c(letters[seq(1,10)]),
size = runif(10, min = 10, max = 50),
class = c("x","x","y","x","y",
"y","x","y","x","x"),
id_b = c("A1","A1","B1","B1","B1",
"C1","C1","C1","D1","E1"))
print(input)
id_a size class id_b
<chr> <dbl> <chr> <chr>
1 a 23.6 x A1
2 b 43.6 x A1
3 c 23.9 y B1
4 d 23.4 x B1
5 e 29.1 y B1
6 f 45.7 y C1
7 g 44.6 x C1
8 h 25.6 y C1
9 i 41.1 x D1
10 j 48.4 x E1
# nest input to create a nested tibble for each id_b
input_nest <- input %>% group_by(id_b) %>% nest()
# calculate dominant class
input_nest_dominant <- input_nest %>% mutate(DOMINANT_CLASS = lapply(data, function(x){
# group each nested tibble by class, and calculate total size. Then find the biggest size and extract
# the class value
output <- x %>% group_by(class) %>%
summarise(total_size = sum(size)) %>%
top_n(total_size, n = 1) %>%
pull(class)
return(output)
} ))
# unnest to end up with a tibble
input_nest_dominant_clean <- input_nest_dominant %>%
unnest(cols = c(DOMINANT_CLASS)) %>%
select(-data) %>%
ungroup()
print(input_nest_dominant_clean)
id_b DOMINANT_CLASS
<chr> <chr>
1 A1 x
2 B1 y
3 C1 y
4 D1 x
5 E1 x