Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.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 计算`data.table中`j`表达式中的列名和目标值`_R_Data.table - Fatal编程技术网

R 计算`data.table中`j`表达式中的列名和目标值`

R 计算`data.table中`j`表达式中的列名和目标值`,r,data.table,R,Data.table,考虑 target <- "vs" value <- 1 library(data.table) dt <- as.data.table(head(mtcars)) 如果只有值是变量,那么它工作得很好 dt[, vs == value] # [1] FALSE FALSE TRUE TRUE FALSE TRUE 如果列是变量,我们也可以在data.table范围内调用它 dt[, target, with = FALSE] # vs # 1: 0 # 2:

考虑

target <- "vs"
value <- 1

library(data.table)
dt <- as.data.table(head(mtcars))
如果只有值是变量,那么它工作得很好

dt[, vs == value]
# [1] FALSE FALSE  TRUE  TRUE FALSE  TRUE
如果列是变量,我们也可以在data.table范围内调用它

dt[, target, with = FALSE]
#    vs
# 1:  0
# 2:  0
# 3:  1
# 4:  1
# 5:  0
# 6:  1
但我不知道如何以简单的方式将两者结合起来

注:我很清楚,我可以简单地做到:

dt[[target]] == value
# [1] FALSE FALSE  TRUE  TRUE FALSE  TRUE
但是我需要在数据表范围内使用它,这样我就可以通过引用修改其他列,比如

dt[, NEWCOL := sum(vs == 1), by = am]
下面是当列名和值都是变量时的尝试

dt[, target == value, with = FALSE]
# Null data.table (0 rows and 0 cols)
dt[, target == value]
# [1] FALSE
dt[, (target) == value]
# [1] FALSE
dt[, .(target == value)]
# V1
# 1: FALSE
dt[, eval(target) == value]
# [1] FALSE
dt[target %in% value]
## Empty data.table (0 rows) of 11 cols: mpg,cyl,disp,hp,drat,wt...
最后我想出了一个好主意

dt[, .SD[[target]] == value]
# [1] FALSE FALSE  TRUE  TRUE FALSE  TRUE
但这是非常低效的,这里有一个简单的基准

set.seed(123)
n <- 1e6
dt <- data.table(vs = sample(1L:30L, n, replace = TRUE), am = seq_len(n))
system.time(dt[, NEWCOL := sum(.SD[[target]] == value), by = am])
#  user  system elapsed 
# 13.00    0.02   13.12 
system.time(dt[, NEWCOL2 := sum(vs == value), by = am])
# user  system elapsed 
# 0.82    0.00    0.83 

这里有一个可能的选择

target <- "vs"
value <- 1
dt <- as.data.table(head(mtcars))
substitute()
对于较长的表达式可能是必需的。但是在这种情况下,
call()
会缩短代码并创建相同的
cl
结果。因此,
cl
也可以

cl <- call("==", as.name(target), value)
在考虑了一分钟后,我不确定是否需要替换
value
,因此下面的方法也适用。但正如David所指出的,第一种方法更省时

dt[, eval(as.name(target)) == value]
# [1] FALSE FALSE  TRUE  TRUE FALSE  TRUE

这里有一个可能的选择

target <- "vs"
value <- 1
dt <- as.data.table(head(mtcars))
substitute()
对于较长的表达式可能是必需的。但是在这种情况下,
call()
会缩短代码并创建相同的
cl
结果。因此,
cl
也可以

cl <- call("==", as.name(target), value)
在考虑了一分钟后,我不确定是否需要替换
value
,因此下面的方法也适用。但正如David所指出的,第一种方法更省时

dt[, eval(as.name(target)) == value]
# [1] FALSE FALSE  TRUE  TRUE FALSE  TRUE

我发现这个答案非常有价值,仅用于准备灵活使用
data.table
的调用。不幸的是,我需要等23小时才能给你赏金。顺便说一句,
i
参数中的
j
arg采用类似的方法:。您能检查问题下的最后一条注释吗?也许这对你来说很简单……我发现这个答案非常有价值,只是为了准备调用,以便灵活使用
data.table
。不幸的是,我需要等23小时才能给你赏金。顺便说一句,
i
参数中的
j
arg采用类似的方法:。您能检查问题下的最后一条注释吗?也许这对你来说很简单…这些对我来说都很奇怪。(@jangorecki的赏金把我带到了这里。)为什么要将
by
与行计数器一起使用?这不可能是最优的。为什么
sum
0/1标量?在
dt[,mycol:=0L]的情况下(在我的计算机上)可以更快地生成相同的载体700倍;dt[get(target)=值,mycl:=1L]
。检查
dt[,table(mycol,NEWCOL5)]
除了从Richard的答案中学习到有趣的替换之外,我仍然无法通过参考字符向量输入处理类似的编程更新。类似于:a)
select。这些对我来说都很奇怪。(@jangorecki的赏金把我带到了这里。)为什么要将
by
与行计数器一起使用?这不可能是最优的。为什么
sum
0/1标量?在
dt[,mycol:=0L]的情况下(在我的计算机上)可以更快地生成相同的载体700倍;dt[get(target)=值,mycl:=1L]
。检查
dt[,table(mycol,NEWCOL5)]
除了从Richard的答案中学习到有趣的替换之外,我仍然无法通过参考字符向量输入处理类似的编程更新。类似于:a)
select。
dt[, eval(as.name(target)) == value]
# [1] FALSE FALSE  TRUE  TRUE FALSE  TRUE