使用正则表达式的data.table中的意外行为

时间:2019-05-27 12:01:12

标签: r regex data.table

我正在使用data.table选择一个grepl,以避免与模式匹配的列。

x <- fread("some_csv")
x[, !grepl("some_column_pattern", colnames(x)), with = F]

上面的代码在另一台机器上确实起作用。我们已经移动了主机,但是两者的库版本相同。现在,该代码不再起作用(它可以起作用,但是返回空的data.table)。相反,我必须将grepl明确地包装为向量

x <- fread("some_csv")
x[, c(!grepl("some_column_pattern", colnames(x))), with = F] -- note the c before grepl

据我所知grepl确实已经返回了向量。这是配置问题还是什么?它以多种方式破坏了代码。

2 个答案:

答案 0 :(得分:1)

我会说您的工作流程不是非常data.table。这是完成任务的一些替代方法:

# Some example data:
irisDT <- as.data.table(iris)

# Option 1
columns <- !grepl("Sepal", names(x))
irisDT[, ..columns]

# Options 1b
columns <- grep("Sepal", names(x), value = TRUE)
irisDT[, ..columns]

# Option 2
irisDT[, .SD, .SDcols = patterns("Petal|Species")]

答案 1 :(得分:0)

我会在您的帖子下发表评论,但我没有这样做的权限,所以让我在这里引起您的注意。

我知道我可能会大失所言,我的建议可能不适用于您的情况,但是您是否考虑过使用dplyr来过滤掉不必要的列?

library(dplyr)
df <- data.frame(matrix(rnorm(50), nrow = 5))
colnames(df) <- c(paste0("V_2_", 1:5), paste0("E_1_", 10:14))
df %>% select(matches("_2_"))
#        V_2_1      V_2_2       V_2_3        V_2_4      V_2_5
# 1 -0.6695509 -0.7994552 -0.06336785  0.007156214 0.56270820
# 2  0.3521418  1.2983869 -0.14538194 -0.461601028 0.67707438
# 3 -1.7194806 -1.9609321 -0.07977360 -1.086470094 0.73620195
# 4  1.1076932  0.8557875  1.62897959  0.697183061 0.03481894
# 5 -1.7670001  0.6710729 -1.35564397 -0.303692309 0.22581571

就我而言,它应该确保一致性。