#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))
Комментарии:
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"