如果我想选择data.table中使用二进制搜索在键变量中不包含特定值的所有行,会发生什么?顺便问一下,我想做什么的正确行话是什么?它是"nojoin"吗?这是"消极选择"吗?
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
setkey(DT,x)
Run Code Online (Sandbox Code Playgroud)
让我们对x =="a"但使用二进制搜索的所有行进行正选择
DT["a"]
Run Code Online (Sandbox Code Playgroud)
这很美,但我希望与此相反.我想要所有不是"a"的行,换句话说x!="a"
DT[x!="a"]
Run Code Online (Sandbox Code Playgroud)
那是矢量扫描.以上线路工作但使用矢量扫描.我想用二进制文件.我期待以下工作,但唉......
DT[!"a"]
DT[-"a"]
Run Code Online (Sandbox Code Playgroud)
以上两个不起作用,尝试与无匹配发挥让我无处可去.
[更新1:正如Matthew Dowle所说,我data.table在R-Forge上使用的是1.6.7版本,而不是CRAN.您不会在早期版本中看到相同的行为data.table.]
作为背景:我正在移植一些小实用程序函数来对数据帧的行或数据帧对进行集合操作(即每行是一个集合中的元素),例如唯一 - 从列表中创建集合,union,交叉点,设置差,等,这些模拟物Matlab的intersect(...,'rows'),setdiff(...,'rows')等等,这似乎不具有R中的对应(R的集合操作仅限于载体和列表,而不是基质或数据帧的行).这些小功能的例子如下.如果数据框的这种功能已经存在于某个包或基础R中,我愿意接受建议.
我一直在将这些迁移到数据表,当前方法中的一个必要步骤是查找重复的行.当duplicated()执行返回一个错误,指出数据表必须有钥匙.这是一个不幸的障碍 - 除了设置密钥,这不是一个通用的解决方案,并增加计算成本,还有其他方法来查找重复的对象?
这是一个可重复的例子:
library(data.table)
set.seed(0)
x <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4))
y <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4))
res3 <- dt_intersect(x,y)
Run Code Online (Sandbox Code Playgroud)
产生此错误消息:
Error in duplicated.data.table(z_rbind) : data table must have keys
Run Code Online (Sandbox Code Playgroud)
代码按原样用于数据帧,尽管我已经用模式命名了每个函数dt_operation.
有没有办法解决这个问题?设置键仅适用于整数,这是我不能为输入数据假设的约束.那么,也许我错过了一种使用数据表的聪明方法?
示例设置操作函数,其中集合的元素是数据行:
dt_unique <- function(x){
return(unique(x))
}
dt_union <- function(x,y){
z_rbind <- rbind(x,y)
z_unique <- dt_unique(z_rbind)
return(z_unique)
}
dt_intersect <- function(x,y){
zx <- …Run Code Online (Sandbox Code Playgroud) R的data.table包提供基于键的快速子集值.
所以,例如:
set.seed(1342)
df1 <- data.table(group = gl(10, 10, labels = letters[1:10]),
value = sample(1:100))
setkey(df1, group)
df1["a"]
Run Code Online (Sandbox Code Playgroud)
将返回df1中的所有行,其中group =="a".
如果我想在所有行df1其中group != "a".是否有使用的简明语法data.table?
我正在寻找一种快速的方法来做"不加入"(即保持不合并的行,或内部联接的反向).我一直在做的方法是使用data.table for X和Y,然后设置key.例如:
require(data.table)
X <- data.table(category = c('A','B','C','D'), val1 = c(0.2,0.3,0.8,0.7))
Y <- data.table(category = c('B','C','D','E'), val2 = c(2,3,5,7))
XY <- merge(X,Y,by='category')
> XY
category val1 val2
1: B 0.3 2
2: C 0.8 3
3: D 0.7 5
Run Code Online (Sandbox Code Playgroud)
但我需要反过来,所以我必须这样做:
XY_All <- merge(X,Y,by='category',all=TRUE)
setkey(XY,category)
setkey(XY_All,category)
notXY <- XY_All[!XY] #data.table not join (finally)
> notXY
category val1 val2
1: A 0.2 NA
2: E NA 7
Run Code Online (Sandbox Code Playgroud)
我觉得这很长篇大论(特别是来自data.frame).我错过了什么吗?
编辑:我在考虑了更多关于不加入之后得到了这个
X <- data.table(category = c('A','B','C','D'), val1 = c(0.2,0.3,0.8,0.7),key = "category")
Y <- …Run Code Online (Sandbox Code Playgroud)