首页 > 解决方案 > dplyr group_by 的数据表版本

问题描述

我有一个dplyrgroup_by 版本,我尝试将一个名为 ratio 的列切割成不同的范围。它工作正常。dplyr由于托管 R 工作室(由普通管理员管理),我无法更新到新版本。有没有办法将相同的逻辑重写为data.table方式

 output <- output %>%
      group_by(start = as.IDate(timestamp),VAV =  van_d, conditions = cut(output$ratio, breaks=c(0,0.7,0.8,0.9,1,100),labels=c("0-0.7","0.7-0.8","0.8-0.9","0.9-1",">1"))) %>%
      summarise(duration = n()) %>% 
      ungroup %>% 
        na.omit

标签: rdplyrdata.table

解决方案


data.table一般用法是

 dt[i, j, by]

wherei是对行进行子集化的索引,即它可以采用数字或逻辑表达式,j- 用于列和by分组。此用法仅适用于data.table对象。因此,如果输入数据集是data.frameor tibble,则转换为data.tablewith as.data.table(不会更改原始对象)或 with (通过引用setDT转换为)。data.table

现在,我们指定i,jby。在dplyr代码中,没有filtering 即我们不需要指定i- 所以它保持空白。代码将group_by进入by. 它可以是 alist或 syntax .(,那么jforsummarise也可以是list( .(duration = .N))。.N类似于n()from _dplyr

library(data.table)
setDT(output)[, .(duration = .N), 
  by = .(start = as.IDate(timestamp),VAV =  van_d, 
    conditions = cut(ratio, breaks=c(0,0.7,0.8,0.9,1,100),
             labels=c("0-0.7","0.7-0.8","0.8-0.9","0.9-1",">1"))]

推荐阅读