【发布时间】:2016-02-11 13:01:10
【问题描述】:
我有一系列空的大型数据表。它们看起来像这样(但更大,~6000 列,1 到 100000 行之间):
apple = c(NA, NA, NA)
orange = c(NA, NA, NA)
pear = c(NA, NA, NA)
demo <- data.table(apple, orange, pear)
row.names(demo) <- c("pineapples", "blood oranges", "grapes")
我正在做模式匹配以查看行名是否包含列名,然后将相应的单元格标记为 TRUE/FALSE。我编写了一个运行良好的循环,但速度极慢。
for(i in 1:ncol(demo)) {
demo[, i] <- ifelse(grepl(colnames(demo)[i],
rownames(demo)),
TRUE,
FALSE)
}
有没有人知道如何以更快的方式做到这一点?可以使用java,但我更喜欢用纯R来解决它。
【问题讨论】:
-
您检查过
demo数据集吗?对于data.table,不能指定行名。 -
您可以使用
outer和stringi对此进行矢量化处理,例如outer(row.names(demo), colnames(demo), stringi::stri_detect_fixed) -
@akrun 您可以将行名存储在
data.tables 属性中。虽然我猜最好创建一个列。 -
顺便说一句,这里不需要
ifelse,可以使用for(i in 1:ncol(demo)) demo[, i] <- grepl(colnames(demo)[i], rownames(demo), fixed = TRUE)(注意fixed = TRUE以提高效率) -
大卫·阿伦伯格:效果很好。谢谢你的回答!
标签: r loops optimization grepl