डेटा

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

Expected output - list with 2 tibbles

0
Perlak99 4 सितंबर 2021, 23:54

2 जवाब

सबसे बढ़िया उत्तर

'पोरा' द्वारा समूहीकृत, 'Z' कॉलम के sum प्राप्त करें, फिर 'चौड़े' से 'लंबे' में 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))])
1
akrun 4 सितंबर 2021, 21:06

aggregate का उपयोग करके आप प्रत्येक pora मानों के लिए ZM.* कॉलम जोड़ सकते हैं। प्रत्येक पंक्ति के लिए अधिकतम मान ज्ञात कीजिए।

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"
0
Ronak Shah 5 सितंबर 2021, 01:15