我有一个关于data.table"非连接"成语的问题,灵感来自Iterator的问题.这是一个例子:
library(data.table)
dt1 <- data.table(A1=letters[1:10], B1=sample(1:5,10, replace=TRUE))
dt2 <- data.table(A2=letters[c(1:5, 11:15)], B2=sample(1:5,10, replace=TRUE))
setkey(dt1, A1)
setkey(dt2, A2)
Run Code Online (Sandbox Code Playgroud)
这data.table看起来像这样
> dt1 > dt2
A1 B1 A2 B2
[1,] a 1 [1,] a 2
[2,] b 4 [2,] b 5
[3,] c 2 [3,] c 2
[4,] d 5 [4,] d 1
[5,] e 1 [5,] e 1
[6,] f 2 [6,] k 5
[7,] g 3 [7,] l 2
[8,] h 3 [8,] …Run Code Online (Sandbox Code Playgroud) 我试图从数据表中排除一些行,比如天数和月份 - 不包括例如暑假,这些行总是从6月15日开始到下个月15日结束.我可以根据Date提取那些日子,但是as.Date函数运行速度非常慢,我有月和日的单独整数列,我想只使用它们.
通过选择给定的条目很容易
DT[Month==6][Day>=15]
DT[Month==7][Day<=15]
Run Code Online (Sandbox Code Playgroud)
有没有办法如何使两者data.tables(原始的和我选择的)"差异" .(为什么不是子集?也许我错过了一些简单的东西,但我不想排除像10/6,31/7这样的日子.)
我知道有一种方法可以通过加入来实现,但只是日复一日
setkey(DT, Month, Day)
DT[-DT[J(Month,Day), which= TRUE]]
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) 我有两个数据集,每个数据集至少有420,500个观测值,例如
dataset1 <- data.frame(col1=c("microsoft","apple","vmware","delta","microsoft"),
col2=paste0(c("a","b","c",4,"asd"),".exe"),
col3=rnorm(5))
dataset2 <- data.frame(col1=c("apple","cisco","proactive","dtex","microsoft"),
col2=paste0(c("a","b","c",4,"asd"),".exe"),
col3=rnorm(5))
> dataset1
col1 col2 col3
1 microsoft a.exe 2
2 apple b.exe 1
3 vmware c.exe 3
4 delta 4.exe 4
5 microsoft asd.exe 5
> dataset2
col1 col2 col3
1 apple a.exe 3
2 cisco b.exe 4
3 vmware d.exe 1
4 delta 5.exe 5
5 microsoft asd.exe 2
Run Code Online (Sandbox Code Playgroud)
我想打印在所有的意见dataset1是不相交的dataset2(比较两个col1和col2每个),在这种情况下将打印一切,除了最后一个观察-观察1&2的比赛上col2,但不col1与观察3&4的比赛上col1但不是col2,即: …