Р: Как быстро выбрать обычные слова или одинаковые числа в 2 столбцах из очень большой таблицы? - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть очень большая таблица (1 000 000 X 20) для обработки, и мне нужно сделать это быстро.

Например, в моей таблице 2 столбца X2 и X3:

введите описание изображения здесь

    X1  X2                                          X3
c1  1   100020003001, 100020003002, 100020003003    100020003001, 100020003002, 100020003004
c2  2   100020003001, 100020004002, 100020004003    100020003001, 100020004007, 100020004009
c3  3   100050006003, 100050006001, 100050006001    100050006011, 100050006013, 100050006021

Теперь я хотел бы создать 2 новых столбца, которые содержат

1) общие слова или одинаковые цифры

Например: [1] "100020003001" "100020003002"

2) количество общих слов или одинаковых чисел

Например: [1] 2

Я пробовал метод из приведенного ниже потока, однако время обработки медленное, так как я делал это с циклом for:

Подсчет общих слов в двух строках

 library(stringi)
 Reduce(`intersect`,stri_extract_all_regex(vec1,"\\w+"))

Спасибо за помощь! Я действительно борюсь здесь ...

1 Ответ

0 голосов
/ 03 сентября 2018

Мы можем разделить столбцы 'X2', 'X3' на ,, получить intersect соответствующих list элементов с map2 и использовать lengths для «подсчета» количества элементов в list

library(tidyverse)
df1 %>%
   mutate(common_words = map2(strsplit(X2, ", "),
                              strsplit(X3, ", "),  
                                   intersect), 
          count = lengths(common_words))
# X1                                       X2                                       X3
#1  1 100020003001, 100020003002, 100020003003 100020003001, 100020003002, 100020003004
#2  2 100020003001, 100020004002, 100020004003 100020003001, 100020004007, 100020004009
#3  3 100050006003, 100050006001, 100050006001 100050006011, 100050006013, 100050006021
#                common_words count
#1 100020003001, 100020003002     2
#2               100020003001     1
#3                                0

Или используя base R

df1$common_words <- Map(intersect, strsplit(df1$X2, ", "), strsplit(df1$X3, ", "))
df1$count <- lengths(df1$common_words)

данные

df1 <- structure(list(X1 = 1:3, X2 = c("100020003001, 100020003002, 100020003003", 
"100020003001, 100020004002, 100020004003", "100050006003, 
 100050006001, 100050006001"
 ), X3 = c("100020003001, 100020003002, 100020003004", "100020003001, 
 100020004007, 100020004009", 
 "100050006011, 100050006013, 100050006021")), class = "data.frame", 
  row.names = c("c1", "c2", "c3"))
...