【问题标题】:How would you translate this into data.table package language in R?您如何将其翻译成 R 中的 data.table 包语言?
【发布时间】:2012-05-21 18:37:16
【问题描述】:

我正在尝试学习R 中的data.table 包。我有一个名为DT1 的数据表和一个数据框DF1,我想根据逻辑条件(析取)对一些实例进行子集化。这是我现在的代码:

DF1[DF1$c1==0 | DF1$c2==1,] #the data.frame way with the data.frame DF1
DT1[DT1$c1==0 | DT1$c2==1,] #the data.frame way with the data.table DT1

"Introduction to the data.table package in R" 的第 5 页上,作者给出了一个类似的例子,但带有一个连词(在上面的第二行中将| 替换为&)并指出data.table 包的使用不当。他建议这样做:

setkey(DT1,c1,c2)
DT1[J(0,1)]

所以,我的问题是:如何使用data.table 包语法编写析取条件?这是滥用我的第二行DT1[DT1$c1==0 | DT1$c2==1,] 吗?是否有与J 等效但用于析取的方法?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    该文件表明您可以使用:

    DT1[c1==0 | c2==1, ]
    

    【讨论】:

    • 我认为你的答案仍然是矢量扫描。无论如何谢谢@DWin!
    • 是的,这是 3 个矢量扫描(两个 == 和一个 |)加上相关的矢量分配,如介绍小插图中所述。该文档显示了类似于演示 bad use not good use 的内容。 @Nestorghh 但是你真的是指两列不相交(c1c2)吗?列中不相交的是克里斯托夫的回答:J(c(0,1))。两列之间的不相交现在是矢量扫描,直到内置辅助键,或者同时搜索“手动辅助键”以获得更繁琐的方法。
    • 我确实看到它被称为“坏”做法,但我没有看到适用于这两个列案例的“正确使用”示例,我也没有在常见问题解答中找到一个,也没有搜索档案,也没有多次尝试。
    • 你是对的,但我更多的是回应答案的第一句话。它可能给人的印象是小插曲鼓励了这个成语,或者已经有了 OP 错过的答案。事实上,答案重复了(没有两个DT$)OP 在问题中提出的解决方案并说他(正确地)担心。
    【解决方案2】:

    这是另一个解决方案:

    grpsize = ceiling(1e7/26^2)
    DT <- data.table(
      x=rep(LETTERS,each=26*grpsize),
      y=rep(letters,each=grpsize),
      v=runif(grpsize*26^2))
    
    setkey(DT, x)
    system.time(DT1 <- DT[x=="A" | x=="Z"])
       user  system elapsed 
       0.68    0.05    0.74 
    system.time(DT2 <- DT[J(c("A", "Z"))])
       user  system elapsed 
       0.08    0.00    0.07 
    all.equal(DT1[, v], DT2[, v])
    TRUE
    

    请注意,我从 data.table 文档中获取了示例。唯一的区别是我不再将字母转换为因子,因为现在允许使用字符键(请参阅 NEWS for v 1.8.0)。

    简短说明:J 只是 data.table 的缩写。因此,如果您调用 J(0, 1),您将创建一个包含两列匹配的 data.table,就像在示例中一样:

    > J(0,1)
         V1 V2
    [1,]  0  1
    

    但是,您希望在一列中匹配两个不同的元素。因此,您需要一个带有一列的data.table。所以只需添加c()

    J(c(0,1))
         V1
    [1,]  0
    [2,]  1
    

    【讨论】:

    • +1。但 OP 需要澄清:他真的是指两列不相交(c1c2)吗?这个答案很适合在一列内不相交。
    • @MatthewDowle 对,我错过了……我猜 OP 的意思实际上是跨两列不相交。
    • @MatthewDowle & @Christoph_J,我的意思是在我的data.table DT1 的两列 c1c2 上不相交。那我必须以矢量扫描方式进行吗?谢谢
    • @Nestorgh 是的,但还有其他一些选项,例如手动辅助键。请参阅其他问题中的评论。如果您对此感到困惑,请告诉我们。在 datatable-help 存档中搜索“手动辅助键”。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    相关资源
    最近更新 更多