【问题标题】:How to filter and subset data using data.table package in R?如何使用 R 中的 data.table 包过滤和子集数据?
【发布时间】:2022-11-20 18:03:37
【问题描述】:

我正在学习使用data.table,因为我正在处理非常大的数据并且需要速度。为了便于使用,我一直使用dplyr,但现在想更多地使用data.table

在底部运行代码时,我向数据框 testDF 添加了一个“总计”列。这是我的data.table技能结束的地方。但我真正需要的是“总计”> 0 的实例的每个“ID”。所以我在这个例子中寻找的输出只是 1 和 50,这些 ID 是“总计”> 0。我将如何有效地计算这个使用data.table?请注意,这将运行的实际数据库有数百万行,因此我希望避免不必要的计算。

我包括看似无关的列“Period_1”、“Period_2”和“State”,因为当我在使用 data.table 子集时,在运行 lapply(.SD,sum),by=.(ID)][,if(sum(PUR)>0) .SD,by=ID] 之类的东西时,我遇到了类似这样的错误 “sum(Period_2) 错误:参数的“类型”(字符)无效

我将使用这些输出进行“连接”,这是我可以在data.table 中做的事情(我认为)。

下面是运行代码时的输出视图:

代码:

library(data.table)

testDF <-
  data.frame(
    ID = as.numeric(c(rep(1,3),rep(50,3),rep(60,3))),
    Period_1 = as.numeric(c(1:3,1:3,1:3)),
    Period_2 = c("2012-06","2012-07","2012-08","2013-06","2013-07","2013-08","2012-01","2012-02","2012-03"),
    PUR = as.numeric(c(rep(10,3),21:23,rep(0,3))),
    CA = as.numeric(c(rep(5,3),11:13,rep(0,3))),
    State = c("XX","AA","XX","AA","BB","CC","SS","XX","AA")
  )

testDF_Adv <- testDF
setDT(testDF_Adv)[, total := sum(PUR + CA), by=list(ID)]
testDF_Adv <- as.data.frame(testDF_Adv)
testDF_Adv

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    下面,我只是通过过滤掉总计为 0 的行来创建一个新的数据表。您是否希望一步完成此操作以提高效率?

    library(data.table)
    
    testDF <-
      data.frame(
        ID = as.numeric(c(rep(1,3),rep(50,3),rep(60,3))),
        Period_1 = as.numeric(c(1:3,1:3,1:3)),
        Period_2 = c("2012-06","2012-07","2012-08","2013-06","2013-07","2013-08","2012-01","2012-02","2012-03"),
        PUR = as.numeric(c(rep(10,3),21:23,rep(0,3))),
        CA = as.numeric(c(rep(5,3),11:13,rep(0,3))),
        State = c("XX","AA","XX","AA","BB","CC","SS","XX","AA")
      )
    
    testDF_Adv <- testDF
    setDT(testDF_Adv)[, total:=sum(PUR+CA),by=list(ID)]
    testDF2 = testDF_Adv[total>0,]
    testDF2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 2021-10-05
      • 2013-01-08
      • 2020-08-11
      • 1970-01-01
      相关资源
      最近更新 更多