Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如果列名是字符串,则按行选择_R_Data.table - Fatal编程技术网

R 如果列名是字符串,则按行选择

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[

我必须处理庞大的数据集,这就是为什么我必须使用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[ "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]
,或者按照@Frank
dt[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]