首页 > 解决方案 > R:如何从一个非常大的表格中快速选择两列中的常用词或相同数字?

问题描述

我有一张非常大的桌子(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+"))

谢谢您的帮助!我在这里真的很挣扎......

标签: rdataframedata-science

解决方案


我们可以将 'X2'、'X3' 列除以,,得到intersect对应list元素的map2lengthslist

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"))

推荐阅读