我试图在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
但是对于析取?
答案 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