【问题标题】:R Optimization of grep of data tableR优化数据表的grep
【发布时间】: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,不能指定行名。
  • 您可以使用outerstringi 对此进行矢量化处理,例如outer(row.names(demo), colnames(demo), stringi::stri_detect_fixed)
  • @akrun 您可以将行名存储在data.tables 属性中。虽然我猜最好创建一个列。
  • 顺便说一句,这里不需要ifelse,可以使用for(i in 1:ncol(demo)) demo[, i] &lt;- grepl(colnames(demo)[i], rownames(demo), fixed = TRUE)(注意fixed = TRUE 以提高效率)
  • 大卫·阿伦伯格:效果很好。谢谢你的回答!

标签: r loops optimization grepl


【解决方案1】:

我们可以创建一个带有FALSE 值的数据集,因为“data.table”中不允许使用row.names,所以创建一个包含这些名称的向量

rn <- c("pineapples", "blood oranges", "grapes")
for(j in seq_along(demo)){
    set(demo, i= grep(names(demo)[j], rn), j=j, value = TRUE)
   }

数据

 demo <- as.data.table(matrix(FALSE,3,3, 
    dimnames=list(NULL, c('apple', 'orange', 'pear'))))

【讨论】:

  • @docendodiscimus 你是对的。感谢您的评论。
猜你喜欢
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
相关资源
最近更新 更多