首页 > 解决方案 > 比较来自两个不同列的字符串,其中每个单元格包含重复值并在 R 中计算它们

问题描述

我正在使用具有两列包含“单词”(字母-数字-数字)的数据框:

df <- data.frame(A = c("V01, G30, V01, M05, M05, M05, N98", "J56, K45, L78, J56"),
                 B = c("J45, H67, M05, N54, M05, J76, V01", "S54, F32, K45")) 

字符串并不总是相同的长度,它们包含不同的单词。有些词是相似的,有些甚至是重复的。我想获得的是三个新列。

第一列给出了每个单词在 A 列中出现的次数,第二列给出了每个单词在 B 列中出现的次数,最后第三列给出了每个单词在 A 列和 B 列的交叉点中出现的次数. 输出应如下所示:

df <- data.frame(A = c("V01, G30, V01, M05, M05, M05, N98", "J56, K45, L78, J56"),
                 B = c("J45, H67, M05, N54, M05, J76, V01", "S54, F32, K45"), 
                 col1 = c("V01*2, G30*1, M05*3, N98*1", "J56*2, K45*1, L78*1"),
                 col2 = c("J45*1, H67*1, M05*2, N54*1, J76*1, V01*1", "S54*1, F32*1, K45*1"), 
                 col3 = c("V01*1, M05*2", "K45*1"))  

我真的不知道从哪里开始,所以任何帮助将不胜感激!!!

标签: rstringdataframecharacterstring-comparison

解决方案


一个选择是

library(tidyverse)
f1 <-   function(dat, colNm) {
          dat %>%
              select(colNm) %>%
              rownames_to_column('rn') %>% 
              separate_rows(!! rlang::sym(colNm)) %>% 
              add_count(rn, !! rlang::sym(colNm)) %>%
              unite(colN, !! rlang::sym(colNm), n, sep="*") %>% 
              group_by(rn) %>% 
              summarise_at(1, ~ toString(unique(.)))  %>%
              select(-rn)


}
df1 <- df %>%  
          mutate_all(str_extract_all, "\\w+") %>% 
          pmap_chr(~ keep(.y,  .y %in% intersect(.x, .y)) %>% 
                    toString) %>%
          mutate(df, C = .)
map_dfc(names(df1), f1, dat = df1) %>%
    rename_all(~ str_c("col", 1:3)) %>%
    bind_cols(df, .)
#                               A                                 B                       col1                                     col2
#1 V01, G30, V01, M05, M05, M05, N98 J45, H67, M05, N54, M05, J76, V01 V01*2, G30*1, M05*3, N98*1 J45*1, H67*1, M05*2, N54*1, J76*1, V01*1
#2                J56, K45, L78, J56                     S54, F32, K45        J56*2, K45*1, L78*1                      S54*1, F32*1, K45*1
#          col3
#1 M05*2, V01*1
#2        K45*1

推荐阅读