R — Проверьте, какая смена отработала больше часов за это время, используя только функции xapply

#r #apply

Вопрос:

Данные

 set.seed(45)
data2 <- data.frame(pora = sample(c("dzień", "noc"), 30, replace=TRUE),
                    ZM1 = sample(1:200, 30, replace=TRUE),
                    ZM2 = sample(1:200, 30, replace=TRUE),
                    ZM3 = sample(1:200, 30, replace=TRUE))
 

Ожидаемый результат - список с 2 тибблами

Комментарии:

1. Вот и весь результат. Это список с 2 элементами, показывающими, какая смена (ZM1 или ZM2) отработала больше часов в данное время суток.

2. Основываясь на показанных входных данных, я получаю ZM2 и ZM3, суммируя эти столбцы, сгруппированные по «поре»

Ответ №1:

Сгруппированные по «поре», получите sum столбцы «Z», затем измените формат с «широкого» на «длинный» с pivot_longer slice помощью строки , в которой находится столбец «значение» max ( slice_max ), а split столбец «значение» по «поре» в list

 library(dplyr)
library(tidyr)
data2 %>% 
   group_by(pora) %>% 
   summarise(across(everything(), sum)) %>% 
   pivot_longer(cols = -pora, names_to = 'lepsza') %>% 
   group_by(pora)  %>%
   slice_max(order_by = value, n = 1) %>%
   ungroup %>% 
   select(-value) %>%
    {split(.[-1], .$pora)}
 

если мы хотим, чтобы *apply функции

 lapply(split(data2[-1], data2$pora), function(x) names(x)[which.max(colSums(x))])
 

Ответ №2:

С помощью aggregate вы можете суммировать ZM.* столбцы для каждого pora значения. Найдите максимальное значение для каждой строки.

 tmp <- aggregate(.~pora, data2, sum)
result <- cbind(tmp[1], lepsza = names(tmp)[-1][apply(tmp[-1], 1, which.max)])

#   pora lepsza
#1 dzień    ZM2
#2   noc    ZM3
 

Если вам нужен список в качестве вывода.

 split(result$lepsza, result$pora)
#$dzień
#[1] "ZM2"

#$noc
#[1] "ZM3"