【问题标题】:Using column index in data.table condition在 data.table 条件中使用列索引
【发布时间】:2016-06-01 11:31:53
【问题描述】:
dt <- data.table(id=c(8,5,4,9,2,7), col1=c(2,1,2,2,3,1), col2=c(1,1,1,2,3,1))

   id col1 col2
1:  8    2    1
2:  5    1    1
3:  4    2    1
4:  9    2    2
5:  2    3    3
6:  7    1    1

我想对 dt 进行子集化,以仅使用列索引而不是名称来获取 col1col2 中包含值 2 的行。

编辑:明确地说,我对只有列索引已知(名称未知)的情况感兴趣。

【问题讨论】:

  • 喜欢dt[col1 %in% 2 | col2 %in% 2,] ?
  • 不,像这样dt[as.vector(dt[,2,with=F] == 2) | as.vector(dt[,3,with=F] == 2)],但是我有很多列,所以复制粘贴相同的条件并更改列索引是不切实际的。

标签: r data.table


【解决方案1】:

您可以使用.SD.SDcols

dt[dt[, Reduce("|", lapply(.SD, function(x) x==2)), .SDcols=2:3]]

【讨论】:

    【解决方案2】:
    dt[rowSums(dt[,grep('col',names(dt)), with=F]==2)!=0,]
       id col1 col2
    1:  8    2    1
    2:  4    2    1
    3:  9    2    2
    

    使用列索引:

    dt[rowSums(dt[,c(2,3), with=F]==2)!=0,]
    

    【讨论】:

    • 这仍然使用列名
    • 我宁愿排除 id 列然后与 2 进行比较,以防有无数列。
    • dt[rowSums(dt[,2:3, with=F]==2)!=0,] 是基于索引的解决方案。
    • @Orion,给你。
    • dt[rowSums(dt[,grep('col',names(dt)), with=F]==2)!=0,] 在列名包含字符串 col 时很有用,但仍然取决于列名。
    【解决方案3】:

    这行得通

    > dt <- data.table(id=c(8,5,4,9,2,7), col1=c(2,1,2,2,3,1), col2=c(1,1,1,2,3,1))
    > dt[dt[[2]] == 2 | dt[[3]] == 2]
       id col1 col2
    1:  8    2    1
    2:  4    2    1
    3:  9    2    2
    

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 2018-04-30
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      相关资源
      最近更新 更多