如何在data.table中使用%in%运算符实现列值匹配?
在data.table中实现等价于data.frame的
head(mtcars[,2]) %in% 6功能 你遇到的问题其实是data.table和data.frame在单列提取时的默认行为差异:data.frame提取单列时默认会返回向量(drop=TRUE),而data.table提取单列时默认返回的是一个单列的data.table对象,这就导致你直接用as.data.table(mtcars)[,2] %in%4时,是在判断整个data.table是否等于4,结果自然是FALSE。
下面给你几种优雅的解决方案,不用转成data.frame:
方法一:使用双括号
[[提取向量
双括号是data.table中直接提取列向量的常用方式,和data.frame的行为一致:head(as.data.table(mtcars)[[2]]) %in% 6执行后会得到你想要的结果:
[1] TRUE TRUE FALSE TRUE FALSE TRUE方法二:直接使用列名提取向量
如果知道列的名称(比如mtcars的第二列是cyl),可以直接在j表达式中写列名,data.table会返回向量:head(as.data.table(mtcars)[, cyl]) %in% 6方法三:结合
.SDcols提取指定位置的列向量
如果你想通过列位置索引,同时明确指定提取向量,可以用.SDcols配合.SD[[1]]:head(as.data.table(mtcars)[, .SD[[1]], .SDcols = 2]) %in% 6
这几种方法都能优雅地实现你需要的功能,避免了转换成data.frame的繁琐步骤。
内容的提问来源于stack exchange,提问作者vladli
相关产品推荐
相关产品推荐

