合并在r中共享公共元素的列表及其相应的列表ID?

时间:2020-08-08 22:37:33

标签: r loops grouping nested-lists consolidation

我有下表组ID(GroupNum)以及与它们关联的值的列表(NPI_list):

df1 <- data.frame(GroupNum=c(41,224,1032,2754,3907,4107),
              NPI_list=c('1740411552,1932387479','1710112156,1841438280',
                         '1629405113,1942433891','1629405113,1992083588',
                         '1710112156,1841438280','1740411552,1932387479'),
              stringsAsFactors = F)

在某些情况下,列表之间存在共同的元素。我需要将具有共同值的组合并到它们各自的GroupNum ID中,以便获得类似于以下内容的最终产品

df2 <- data.frame(GroupNum=c('41,4107','224,3907','1032,2754'),
              NPI_list=c('1740411552,1932387479','1710112156,1841438280','1629405113,1992083588,1942433891'),
              stringsAsFactors = F)

有人告诉我,有一种方法可以通过python确定list之间是否存在公共元素,但是我只有R的经验。我尝试了与下面的Duck类似的dplyr解决方案,但仍将NPI_list和I需要能够将每个列表中的各个元素与所有其他列表中的各个元素进行比较,如果存在单个匹配项,则将这些列表合并。

任何建议都会有所帮助。我怀疑我需要使用某种for循环。

1 个答案:

答案 0 :(得分:0)

我认为这可以为您提供帮助。您必须在数据框中显示数据。下次,请在数据框中使用dput(yourdata)dput(head(yourdata,20))来包含您的数据或其中的一部分,并将结果粘贴到问题中。帮助您更容易。接下来是使用相似数据并使用dplyr的可能解决方案:

library(dplyr)
#Data
df1 <- data.frame(GroupNum=c(41,224,1032,2754,3907,4107),
                  NPI_list=c('1740411552,1932387479','1710112156,1841438280',
                             '1639127913,1942433891','1629405113,1992083588',
                             '1710112156,1841438280','1740411552,1932387479'),
                  stringsAsFactors = F)
#Aggregate
df2 <- df1 %>% group_by(NPI_list) %>% 
  mutate(N=n(),id=cur_group_id(),id=ifelse(N==1,0,id)) %>%
  ungroup() %>% group_by(id) %>%
  summarise(GroupNum=paste0(GroupNum,collapse = ','),
            NPI_list=paste0(unique(NPI_list),collapse = ',')) %>% ungroup() %>% select(-id)

输出将是:

# A tibble: 3 x 2
  GroupNum  NPI_list                                   
  <chr>     <chr>                                      
1 1032,2754 1639127913,1942433891,1629405113,1992083588
2 224,3907  1710112156,1841438280                      
3 41,4107   1740411552,1932387479