【问题标题】:R - Check which shift did more hours in which time only using xapply functionsR - 仅使用 xapply 函数检查哪个班次在哪个时间做了更多的时间
【发布时间】:2021-09-04 20:54:27
【问题描述】:

数据

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 个元素的列表,显示哪个班次(ZM1 或 ZM2)在一天中的给定时间做了更多的时间。
  • 根据显示的输入,我通过将按“pora”分组的那些列相加得到 ZM2 和 ZM3

标签: r apply


【解决方案1】:

按“pora”分组,获取“Z”列的sum,然后用pivot_longerslice将“值”列为max的行从“宽”重塑为“长” (slice_max) 和split 的'value' 列由'pora' 变成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,您可以对每个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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2016-07-07
      • 2021-04-01
      • 1970-01-01
      相关资源
      最近更新 更多