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

70
3

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

спросил(а) 2016-02-11T16:01:00+03:00 4 года, 8 месяцев назад
1
Решение
80

Мы можем создать набор данных со значениями 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'))))

ответил(а) 2016-02-11T16:07:00+03:00 4 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема