如何基于向量高效筛选data.table行?索引方法遇阻求助
解决data.table中基于向量筛选的问题
这个问题的核心是data.table和data.frame在提取单列时的返回类型差异:
问题根源
当你用ids <- z[wt > 3.5, "mpg"]提取data.table的列时,返回的是一个单列的data.table对象,而不是像data.frame那样默认返回向量(data.frame只有在drop=FALSE时才会返回data.frame)。%in%运算符是用来比较向量的,用data.table和向量自然无法正确匹配,这就是代码失效的原因。
而你在data.frame中能正常运行,是因为mtcars[mtcars$wt > 3.5, "mpg"]默认返回了向量;直接输入数值向量也能运行,同样是因为传入了%in%需要的向量类型。
正确解决方案
以下几种写法都能解决问题,推荐使用符合data.table语法习惯的第一种:
方案1:直接提取列向量(推荐)
在data.table的j参数中直接写列名(不带引号),会直接返回该列的向量:
library(data.table) z <- data.table(mtcars) # 提取mpg列的向量 ids <- z[wt > 3.5, mpg] # 正常筛选 z[mpg %in% ids, ]
方案2:用[[提取向量
如果习惯用字符串指定列名,可以先筛选行再用[[提取向量:
ids <- z[wt > 3.5][["mpg"]] z[mpg %in% ids, ]
方案3:用get()提取向量
如果必须通过字符串变量指定列名,使用get()函数可以返回向量:
col_name <- "mpg" ids <- z[wt > 3.5, get(col_name)] z[mpg %in% ids, ]
关于你尝试的类型转换
你之前尝试的as.numeric(ids)其实可以把单列data.table转成向量,但如果还是失效,大概率是浮点数精度问题(比如mpg的数值存储有细微小数差异)。不过最根本的解决方式还是一开始就提取正确的向量类型,避免不必要的类型转换。
内容的提问来源于stack exchange,提问作者MatthewR
相关产品推荐
相关产品推荐

