Учитывая большой data.table, используйте бинарный поиск, чтобы найти правильную строку на основе первых двух столбцов, а затем добавьте 1 к третьему столбцу - PullRequest
0 голосов
/ 27 июня 2019

У меня есть датафрейм с 3 столбцами. Первые два столбца - это идентификаторы (ID1 и ID2), относящиеся к одному и тому же элементу, а третий столбец - это счетчик количества отображений элементов с этими двумя идентификаторами. В кадре данных много строк, поэтому я хочу использовать двоичный поиск, чтобы сначала найти соответствующую строку, в которой совпадают оба идентификатора, а затем добавить 1 в ячейку под столбцом подсчета в этой строке.

Я использовал функцию which(), чтобы найти индекс правильной строки, а затем с помощью индекса добавил 1 к столбцу count.

Например:

index <- which(DF$ID1 == x & DF$ID1 == y)

DF$Count[index] <- DF$Count[index] + 1

Пока это работает, функция которого очень неэффективна. Поскольку я должен делать это в цикле for более триллиона раз, это занимает много времени. Кроме того, есть только одна строка во фрейме данных с этой комбинацией идентификаторов. В то время как функция which проходит через все строки, функции, которая останавливается, когда находит правильную строку, должно быть достаточно. Я пытался использовать data.table и setkey для этой цели, но не знаю, как реализовать это для моих целей. Заранее спасибо.

1 Ответ

0 голосов
/ 27 июня 2019

Действительно, вы можете использовать data.table и setkeyv (не setkey, потому что вам нужно 2 столбца в качестве индексов)

library(data.table)

DF <- data.frame(ID1=sample(1:100,100000,replace=TRUE),ID2=sample(1:100,100000,replace=TRUE))
# convert DF to a data.table
DF <- as.data.table(DF)
# put both ID1 and ID2 as indexes, in that order
setkeyv(DF,c("ID1","ID2"))
# random x and y values
x <- 10
y <- 18
# select value for ID1=x and ID2=y and add 1 in the Count column
DF[.(x,y),"Count"] <-  DF[,.(x,y),"Count"]+1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...