R 子集数据。表列独立
我从下表R 子集数据。表列独立,r,data.table,subset,R,Data.table,Subset,我从下表dt开始,并尝试通过列表键将其列子集: library(data.table) set.seed(123) randomchar <- function(n, w){ chararray <- replicate(w, sample(c(letters, LETTERS), n, replace = TRUE)) apply(chararray, 1, paste0, collapse = "") } dt <- data.table(x = random
dt
开始,并尝试通过列表键将其列子集:
library(data.table)
set.seed(123)
randomchar <- function(n, w){
chararray <- replicate(w, sample(c(letters, LETTERS), n, replace = TRUE))
apply(chararray, 1, paste0, collapse = "")
}
dt <- data.table(x = randomchar(1000, 3),
y = randomchar(1000, 3),
z = randomchar(1000, 3),
key = c("x", "y", "z"))
keys <- with(dt, list(x = sample(x, 501),
y = sample(y, 500),
z = sample(z, 721)))
库(data.table)
种子集(123)
randomchar如何在该掩码上构建掩码和过滤器dt
:
dt[Reduce(`&`, Map(function(key, col) col %in% key, keys, dt)),]
创建一个新的字段key
,将所有三个键与paste
连接起来并对其进行过滤怎么样?我想你的意思是使用do.call(CJ,keys)
@Frank,可能吧-我刚刚尝试了一下,它就完成了,但两者都需要更长的时间,并且没有给出想要的结果。哦,对了。嗯,似乎dt[do.call(CJ,keys),nomatch=0]
应该可以工作,但它也给出了错误的结果。。。我认为有一个FR可以使用键或索引进行复合测试,例如使用键或索引进行复合测试,如a%in%as&b%in%bs
,但找不到。这里是:这个实现的速度大约是我的两倍副本需要很多时间,而这里只是过滤。
dt[Reduce(`&`, Map(function(key, col) col %in% key, keys, dt)),]