您如何将其转换为R中的data.table包语言?

时间:2012-05-21 18:37:17

标签: r data.table

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

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但是对于析取?

2 个答案:

答案 0 :(得分:4)

该文件表明您可以使用:

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

答案 1 :(得分:3)

这是另一种解决方案:

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文档中获取了示例。唯一的区别是我不再将字母转换为因子,因为现在允许使用字符键(对于v 1.8.0,请参阅NEWS)。

简短说明: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