我正在使用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
确实已经返回了向量。这是配置问题还是什么?它以多种方式破坏了代码。
答案 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
就我而言,它应该确保一致性。