R: сравнение двух символьных столбцов в большом фрейме данных

Итак, у меня есть действительно огромный фрейм данных, в котором есть два столбца символов. символы представляют собой некоторые значения идентификаторов, разделенные знаком «;». Итак, я хочу рассчитать количество общих значений идентификатора между этими двумя столбцами. Вот пример:

   id.x                  id.y
1  123;145;156       143;156;234;165
2  134;156;187;675   132;145;156;187

поэтому в этом случае первая строка имеет 1 общее значение, а вторая строка имеет два общих значения.

Размер таблицы составляет 60 миллионов записей, а длина некоторых строк может превышать 1000. Я попытался записать данные в текстовый файл и выполнить этот анализ с помощью python, но размер файла составляет 30 ГБ. Любая идея сделать это в R? (regex, применить, ..)

Я могу подсчитать количество общих значений с помощью этой команды:

intersect(strsplit(df[1,"ind.x"], split=";")[[1]], strsplit(df[1,"ind.y"], split=";") [[1]])

Поэтому я написал функцию:

myfun <- function(x,y) {
   length(intersect(strsplit(x, split=";")[[1]], strsplit(y, split=";")[[1]]))
}

который работает, когда я пробую его с одним вызовом, но когда я использую его с mapply, как показано ниже, он печатает все столбцы, но мне нужен только номер на выходе:

> mapply(FUN=myfun, df[1:2,]$id.x, df[1:2,]$id.y)
123;145;156 134;156;187;675 
          1               2

Итак, почему он печатает и первый столбец? Что не так с моей командой?


person Vahid Mirjalili    schedule 18.10.2013    source источник
comment
Если вас не волнует ничего, кроме строки, на которую вы смотрите, просто читайте по одному (или по несколько за раз) и обрабатывайте таким образом. файлу размером 30 ГБ потребуется 60-90 ГБ памяти, если вы хотите прочитать его все сразу...   -  person Justin    schedule 18.10.2013
comment
Итак, что такое функция, сравнивающая две строки по одной за раз? С четырьмя петлями?   -  person Vahid Mirjalili    schedule 19.10.2013
comment
Я думаю, что Python более эффективен, чем R, и предлагаю вам добавить это как тег. В R есть стратегии для сегментированного чтения из последовательных соединений, но они довольно неуклюжи.   -  person IRTFM    schedule 19.10.2013


Ответы (1)


Mapply возвращает целочисленный вектор с атрибутами имени.

y <- mapply(myfun, df$id.x, df$id.y)
str(y)
Named int [1:2] 1 2
- attr(*, "names")= chr [1:2] "123;145;156" "134;156;187;675"

Бросьте их с USE.NAMEs

mapply(myfun, df$id.x, df$id.y, USE.NAMES=FALSE)
[1] 1 2

И используйте индекс и проверяйте время на все больших и больших наборах данных.

system.time(y <- mapply(myfun, df[1:1e5,]$id.x, df[1:1e5,]$id.y, USE.NAMES=FALSE))
person Chris S.    schedule 18.10.2013