R 如果列名是字符串,则按行选择
我必须处理庞大的数据集,这就是为什么我必须使用data.table包。我只想选择在给定列中具有适当值的行R 如果列名是字符串,则按行选择,r,data.table,R,Data.table,我必须处理庞大的数据集,这就是为什么我必须使用data.table包。我只想选择在给定列中具有适当值的行 dt <- data.table(a = rep(c("A", "B", "C"), 3), b = 1:9) n <- c("A", "C") 若我以前不知道列的名称,而从函数中以字符串的形式获取它,该怎么办?我试过: dt[ "a" %in% n] Empty data.table (0 rows) of 2 cols: a,b dt[
dt <- data.table(a = rep(c("A", "B", "C"), 3),
b = 1:9)
n <- c("A", "C")
若我以前不知道列的名称,而从函数中以字符串的形式获取它,该怎么办?我试过:
dt[ "a" %in% n]
Empty data.table (0 rows) of 2 cols: a,b
dt[ "a" %in% n, with = F]
Error in `[.data.table`(dt, "a" %in% n, with = F) :
j must be provided when with=FALSE
dt[ as.name("a") %in% n ]
Error in match(x, table, nomatch = 0L) :
'match' requires vector arguments
问题-可以在这样的任务中使用字符串吗?使用
get
函数
dt[get('a') %in% n]
如果colname存储在另一个变量中,它也可以工作:
temp <- 'a'
dt[get(temp) %in% n]
temp可以通过多种方式实现这一点
使用联接(将返回一个有序的结果,而不进行排序dt
in-place)
或(在排序dt
时也将返回排序结果)
或者使用eval
/作为.name
(将返回未排序的结果)
或者使用列表子集(将返回未排序的结果)
您可能需要考虑的几点
在V1.9.4 data.table包中引入了二级索引。这意味着,当您执行向量扫描(==
或%
中的%时),它将创建某种排序或键(与显式使用设置键类似),这将使第一次运行稍微慢一点,但在下次搜索此列中的匹配项时将显著提高性能
不过,并非所有情况下都会(永久)设置辅助键。在某些情况下,它将始终是一个简单的向量扫描(例如,dt[eval(as.name(“a”))%n中的dt[eval,verbose=TRUE]
或dt[get('a')%n]
或dt[dt[[a]%n,verbose=TRUE]
),如果只运行一次,速度会更快。在某些情况下,将在每次运行中创建一个次优的特别索引(例如dt[n,on=“a”,verbose=TRUE]
,但如果索引已经存在,也将使用该索引),而在某些情况下,将设置一个永久键或一个辅助键(例如setkeyv(dt,“a”)[(n),verbose=TRUE]
,或者按照@Frankdt[eval的建议(替换(列在%n中的%col,列在%n中的%col,列在%n中的%col=as.name(“a”))),verbose=TRUE
)尝试dt[n,on=“a”]
或dt[eval(as.name(“a”)%n
或setkeyv(dt,“a”)[n]
@David不妨回答这个问题。eval
一个应该是整个i
而不仅仅是名字,我想,用于自动索引。@Frank,我们不是在什么地方有一些重复吗?也许吧?@DavidArenburg非常感谢你!现在我可以施展这个法术了!get
在庞大的数据集上速度很慢。ab是什么使用setindex()
而不是setkey()
明确设置二级索引?比较DT
temp <- 'a'
dt[get(temp) %in% n]
dt[.(n), on = "a"]
setkeyv(dt, "a")[.(n)]
dt[eval(as.name("a")) %in% n]
dt[dt[["a"]] %in% n]