【问题标题】:data.table: use .SD in idata.table:在 i 中使用 .SD
【发布时间】:2019-11-27 04:01:44
【问题描述】:

我有我的 data.table DT,我想过滤并只保留该行中的 any 值包含字符串“tokeep”的行。

library(data.table)     
cola <- c(1:5)
colb <- c(letters[1:4], "tokeep")
dt <- data.table(cola, colb)
dt
   cola   colb
1:    1      a
2:    2      b
3:    3      c
4:    4      d
5:    5 tokeep

预期结果:

 dt[grepl("tokeep", colb)]
   cola   colb
1:    5 tokeep

但是我不知道在哪一列可以找到 tokeep。我试过在i 中使用.SD 像这样

 dt[any(grepl("tokeep", .SD))]
Empty data.table (0 rows) of 2 cols: cola,colb

另外,无法弄清楚以下内容。

> dt[,print(any(grepl("tokeep", .SD)))]
[1] TRUE
[1] TRUE

不应该是FALSE, TRUE,因为"tokeep"只存在于colb中吗?

【问题讨论】:

  • .SD 仅在 j 中定义。在i.SDNULL。你可以使用dt[rowSums(dt=="tokeep") &gt; 0]。某处应该有骗子
  • 如何使用grepl而不是严格相等?字符串必须包含 tokeep,不能完全等于它
  • 也许是dt[dt[, .I[Reduce(|, lapply(.SD, grepl, pattern="tokeep"))]]]。不确定这是否可以更简洁。但是你可以搜索一个基本的 R 解决方案并用 data.table 语法重新编码,比如dt[dt[apply(dt, 1L, function(x) any(grepl("tokeep", x))), which=TRUE]]
  • 如果你需要遍历行,你通常应该重新排列你的数据。循环遍历data.frame(或data.table)的行很慢。包 data.table 对此无能为力。循环遍历矩阵的行应该更快,但仍然不快。然后问题是重复调用闭包(在本例中为 grepl),特别是对于 grepl,您还反复与正则表达式引擎交互。
  • 重塑为长格式。然后你可以对所有数据进行一次grepl 调用。

标签: r data.table


【解决方案1】:

在阅读this post 之后,我认为这可能是一种将函数应用于 data.table 的所有行的简洁、更 data.table 的方式。对任何其他提议感兴趣。

> dt[dt[, any(grepl("tokeep", .SD)), by = seq_len(nrow(dt))]$V1]
   cola   colb
1:    5 tokeep

【讨论】:

    猜你喜欢
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2014-11-14
    相关资源
    最近更新 更多