[英]Consolidate lists that share common elements in r with their corresponding list IDs?
我有下表的组 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 确定列表之间是否存在共同元素,但我只有 R 的经验。 我已经尝试了与下面的 Duck 类似的 dplyr 解决方案,但它仍然对 NPI_list 进行分组,我需要能够将每个列表中的各个元素与所有其他列表中的元素进行比较,并在有单个匹配时合并列表。
任何意见将是有益的。 我怀疑我需要使用某种 for 循环。
我认为这可以帮助你。 您必须拥有在 dataframe 中显示的数据。 下次请在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)
output 将是:
# 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.