R Оптимизация grep таблицы данных

У меня есть серия пустых больших таблиц данных. Они выглядят так (но намного больше, ~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")

Я выполняю сопоставление с образцом, чтобы увидеть, содержат ли имена строк имена столбцов, а затем помечаю соответствующие ячейки как ИСТИНА/ЛОЖЬ. У меня есть написанный цикл, который работает хорошо, но очень медленно.

for(i in 1:ncol(demo)) {
    demo[, i] <- ifelse(grepl(colnames(demo)[i], 
                                      rownames(demo)), 
                                TRUE, 
                                FALSE)
}

У кого-нибудь есть идеи, как это сделать быстрее? Можно было бы использовать java, но я бы предпочел решить ее на чистом R.


person Hammar    schedule 11.02.2016    source источник
comment
Вы проверили набор данных demo? Для data.table вы не можете назначить имя строки.   -  person akrun    schedule 11.02.2016
comment
Вероятно, вы могли бы векторизовать это, используя outer и stringi, например, outer(row.names(demo), colnames(demo), stringi::stri_detect_fixed)   -  person David Arenburg    schedule 11.02.2016
comment
@akrun вы можете хранить имена строк в атрибутах data.tables. Хотя лучше создать столбец Id предположения.   -  person David Arenburg    schedule 11.02.2016
comment
Кстати, вам не нужно ifelse здесь, вы можете сделать for(i in 1:ncol(demo)) demo[, i] <- grepl(colnames(demo)[i], rownames(demo), fixed = TRUE) (обратите внимание на fixed = TRUE для эффективности)   -  person David Arenburg    schedule 11.02.2016
comment
Дэвид Аренбург: Отлично сработало. Спасибо за ответ!   -  person Hammar    schedule 11.02.2016


Ответы (1)


Мы можем создать набор данных со значениями FALSE, поскольку row.names не разрешены в 'data.table', создайте вектор этих имен

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'))))
person akrun    schedule 11.02.2016
comment
@docendodiscimus Вы правы. Спасибо за комментарий. - person akrun; 11.02.2016