Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.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_Rows - Fatal编程技术网

R 在不同列名上循环以限定数据表中的行

R 在不同列名上循环以限定数据表中的行,r,data.table,rows,R,Data.table,Rows,下面是一个已缩小的示例。我在寻找一个能纠正以下语法的答案,而不是“变通解决方案” 您只需要在R中为数据表正确调用对象。数据表有点像对象的集合。要使用字符串调用它们,我们使用get函数。get函数基本上只是使用字符串按对象名获取数据表条目。数据表通常使用不带引号的字符串来执行此操作 对于您的确切代码,只需使用 for(i in 1:2){ dt=dt[get(paste0('sum',i))<=catsummax[i],] } for(1:2中的i){ dt=dt[get(paste0

下面是一个已缩小的示例。我在寻找一个能纠正以下语法的答案,而不是“变通解决方案”


您只需要在R中为数据表正确调用对象。数据表有点像对象的集合。要使用字符串调用它们,我们使用
get
函数。
get
函数基本上只是使用字符串按对象名获取数据表条目。数据表通常使用不带引号的字符串来执行此操作

对于您的确切代码,只需使用

for(i in 1:2){
  dt=dt[get(paste0('sum',i))<=catsummax[i],]
}
for(1:2中的i){

dt=dt[get(paste0('sum',i))我们可以使用
Map
进行相应的比较,并
将其减少为单个逻辑
向量
,用于对行进行子集划分

dt[, .SD[Reduce(`&`,  Map(`<=`, .SD, catsummax))]]

是的,我明白了,尽管我还不太了解整个元编程,比如调用、名称、表达式、替换、解析、解压、求值、引用、引用

i <- paste(paste0("sum", 1:2, " <= ", catsummax), collapse=" & ")
dt[eval(parse(text=i))]

i为了完整性起见,还有一种替代方法使用
非等联接

as.data.table(as.list(catsummax))[dt, on = .(V1 >= sum1, V2 >= sum2), nomatch = 0L]
on
参数也可以指定为字符向量,即

as.data.table(as.list(catsummax))[dt, on = c("V1>=sum1", "V2>=sum2"), nomatch = 0L]
它允许更灵活的编程解决方案:

如果
catsummax
将被指定为
data.table
而不是与
dt
中的列名称相同的向量进行比较,例如

catsummax_DT <- data.table(sum1 = 0, sum2 = 3)
可以创建一个灵活的解决方案,该解决方案适用于任意可选择的列集:

library(magrittr)
cond <- names(catsummax_DT) %>% sprintf("%s>=%s", ., .)
catsummax_DT[dt, on = cond, nomatch = 0L]

magrittr
只是为了方便和简洁而使用)

dt=dt[get(paste0('sum',i))应该有一种更优雅的方式,但这避免了循环:
dt[which(colSums(t(dt))Chinsoon12,回答一个解决方案,最好是解释get及其语法如何与数据表相关。应该有更好的方法来做到这一点……到目前为止,我只能提出
dt[apply(sweep(dt,2,catsummax,function(x,y))x No chinsoon,我是这样问的,因为上面的数据表只是选定的几列。我只是想纠正语法,正如我所说的,没有找到更有效的解决方法。问题是,这假设整个数据表都是提供的,这些只是我想用于选择bi行的两列gger数据table@robertevansanders这只是您示例的bcz。代码保持不变,只是您指定了
.SDcols
。这不是一个解决方法,而是一个标准数据表。表syntaxImagine相反,您有任意数量的列,名为sum1…sumJ,您需要某种方法来创建要调用的名称列表,这就是我想要的原因就像我说的那样posted@robertevansanders您可以使用
grep(“sum\\d+”,name(dt),value=TRUE)
并将其用作
.SDcols
为什么首选此方法,akrun?FWIW:这种方法可能会对大数据表和许多条件造成性能损失,因为每次循环迭代都会复制数据对象。因此,理想情况下,您希望有一种方法同时执行此操作是吗?
as.data.table(as.list(catsummax))[dt, on = .(V1 >= sum1, V2 >= sum2), nomatch = 0L]
           V1       V2
1: -0.8356286 1.378759
2: -0.8204684 1.955066
3: -0.3053884 2.593901
as.data.table(as.list(catsummax))[dt, on = c("V1>=sum1", "V2>=sum2"), nomatch = 0L]
catsummax_DT <- data.table(sum1 = 0, sum2 = 3)
   sum1 sum2
1:    0    3
library(magrittr)
cond <- names(catsummax_DT) %>% sprintf("%s>=%s", ., .)
catsummax_DT[dt, on = cond, nomatch = 0L]
         sum1     sum2
1: -0.8356286 1.378759
2: -0.8204684 1.955066
3: -0.3053884 2.593901