首页 > 解决方案 > data.table:在 i 中使用 .SD

问题描述

我有我的data.table DT,我想过滤并只保留该行中的任何值包含字符串“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。我试过这样.SD使用i

 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

标签: rdata.table

解决方案


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

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

推荐阅读