【问题标题】:Select rows from Data.table programmatically based on column criteria根据列标准以编程方式从 Data.table 中选择行
【发布时间】:2019-07-01 09:38:40
【问题描述】:

我有一个关于如何根据列中的值以编程方式从 data.table 中选择行的问题。

假设我有下面的 Data.table

library(data.table)
DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)

现在我想选择 y = 3 and v = 2 所在的行

通常我可以使用下面的代码

> DT[y==3& v==2]
   x y v
1: a 3 2

但在我的情况下,这样的选择标准本身就是一个变量,并放入不同的DF

> DF = data.frame('1' = c('y', 'v'), '2' = c(3,2)); DF
  X1 X2
1  y  3
2  v  2

在这种情况下,上面X2 的值会改变,偶数行也是可变的(即假设我有一个更大的DT 和更多的列,DF 中的一些额外行可能会基于DF的生成标准)

有没有办法使用DF 以编程方式选择DT 中的行?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    另一个使用join的选项:

    DT[structure(as.list(DF$X2), names=DF$X1), on=as.character(DF$X1)]
    

    【讨论】:

    • 很棒,但需要先将X1 转换为字符。 setNames(as.list(DF$X2), DF$X1) 可以代替 structure(as.list(DF$X2), names=DF$X1)
    • 哦,我想我一直都有options(stringsAsFactors=FALSE)
    【解决方案2】:

    一个选项是eval pasteing 'DF' 的列来创建一个表达式

    DT[eval(parse(text= paste(DF$X1, DF$X2,  sep="==", collapse=" & ")))]
    #   x y v
    #1: a 3 2
    

    或者我们可以将.SDcols 指定为'X1' 列,然后将.SD 与'X2' 和Reduce 它与&amp; 的逻辑vector 进行比较,对行进行子集化

    DT[DT[, Reduce(`&`, Map(`==`, .SD, DF$X2)),.SDcols = as.character(DF$X1)]]
    #   x y v
    #1: a 3 2
    

    【讨论】:

      猜你喜欢
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2014-05-22
      • 1970-01-01
      • 2014-08-19
      相关资源
      最近更新 更多