【发布时间】: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,.SD是NULL。你可以使用dt[rowSums(dt=="tokeep") > 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