【问题标题】:How to perform further grouping and lookups in .SD for a data.table如何在 .SD 中为 data.table 执行进一步的分组和查找
【发布时间】:2015-07-08 17:50:13
【问题描述】:

在以下示例 hflights 数据中,我想找出每个始发机场和月份的最大和最小 ArrDelays 以及相应的 UniqueCarrier 和 Dest。我让它工作,但我觉得它可以变得更简单。

对于每个 .SD,我可以找到 min(ArrDelay) 和 Max(ArrDelay),但我还需要与 Min 和 Max ArrDelay 对应的 Airline 和 Dest。有没有办法执行该查找?

library(data.table)
library(hflights)

DT <- as.data.table(hflights)

setkey(DT, Origin, Month)


DT[, 
 c(head(.SD[,  .(MaxArrDelay=max(ArrDelay, na.rm = TRUE), Dest) , by=UniqueCarrier][order(-MaxArrDelay)], 1),
   head(.SD[,  .(MinArrDelay=min(ArrDelay, na.rm = TRUE), Dest) , by=UniqueCarrier][order(MinArrDelay)], 1) )
, by=.(Origin, Month) ]

# Test the output for a single record... 
DT[ .("HOU", 1), .(max(na.omit(ArrDelay)), min(na.omit(ArrDelay)))]

【问题讨论】:

  • 你试过which.minwhich.max
  • 你想要的输出是什么?我建议将您的问题减少到更小的问题。另外,@akrun 可能已经回答了这个问题。
  • 感谢@akrun 将我指向which.minwhich.max。这些是要使用的功能。我意识到我的示例代码由于回收而产生了不正确的 Dest。
  • 你检查过我展示的代码吗
  • 是的,效果很好。再次感谢@akrun。

标签: r data.table


【解决方案1】:

你可以试试

 library(data.table)#v1.9.5+
 res1 <- DT[, {min1 <- which.min(ArrDelay)
               max1 <- which.max(ArrDelay)
               list(DestMin=Dest[min1],
               ArrDelayMin=ArrDelay[min1],
               MinUniqueCarrier= UniqueCarrier[min1],
               DestMax= Dest[max1],
               ArrDelayMax= ArrDelay[max1], 
               MaxUniqueCarrier=UniqueCarrier[max1] )}, 
                                 by = .(Origin, Month)]

或者这可以通过

 nm1 <- c('Dest', 'ArrDelay', 'UniqueCarrier')   
 res2 <- DT[, c(.SD[which.min(ArrDelay)], .SD[which.max(ArrDelay)]) , 
                   by = .(Origin, Month), .SDcols= nm1]
 setnames(res2, 3:ncol(res2), paste0(nm1, rep(c('Min', 'Max'),each=length(nm1))))

 all.equal(res1, res2, check.attributes=FALSE)
 #[1] TRUE

或使用dplyr

library(dplyr)
grh <- group_by(hflights, Origin, Month)
Min <- grh %>% 
         slice(which.min(ArrDelay)) %>% 
         select(Dest, ArrDelay, UniqueCarrier) %>%
         setNames(., c(names(.)[1:2], paste0(names(.)[3:5], 'Min')))
Max <- grh %>% 
         slice(which.max(ArrDelay)) %>% 
         select(Dest, ArrDelay, UniqueCarrier) %>%
         setNames(., c(names(.)[1:2], paste0(names(.)[3:5], 'Max')))
bind_cols(Min, Max[-(1:2)])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多