首页 > 解决方案 > 如何根据数据框中相邻单元格的值汇总数据

问题描述

我有一个名为 siteData 的数据框,它有大约 40,000 行和 4 列,这是一个示例。

Uniprot.ID Site Other_Sites
Q8NE71     E403     
Q8NE71     E705     
Q09666     E545     
Q09666     E550     
Q09666     E574     
Q09666     E766     
Q09666     E796    

对于给定的,Uniprot.ID我想将列出的所有站点添加到Other_Sites列中,但相邻列中列出的站点除外Site

我已经尝试过这个简单的 for 循环。我了解如何使用 访问给定Uniprot.ID出现的行号,grepl我遇到的问题是以一种对整个数据集重复执行此操作的方式编写代码。

for (i in 1:nrow(siteData)) {
  siteData$Other_Sites[i] = siteData[which(grepl(siteData$Uniprot.ID[i], 
                             siteData$Uniprot.ID)),2]
}

目前我的代码只SiteOther_Sites列添加一个值,但对于我的示例数据,我希望它看起来像这样:

Uniprot.ID Site  Other_Sites
Q8NE71     E403    E705 
Q8NE71     E705    E403 
Q09666     E545    E550,E574,E766,E769  
Q09666     E550    E545,E574,E766,E769
Q09666     E574    E545,E550,E766,E769  
Q09666     E766    E545,E550,E574,E769  
Q09666     E796    E545,E550,E574,E766

更多数据表格:

structure(list(Uniprot.ID = c("Q8NE71", "Q8NE71", "Q8NE71", "Q8NE71", 
"Q8NE71", "Q8NE71", "Q09666", "Q09666", "Q09666", "Q09666", "Q09666", 
"Q09666", "Q09666", "Q09666", "Q09666", "Q09666", "Q09666", "Q09666", 
"Q09666", "Q09666", "Q09666", "Q09666", "Q09666", "Q09666", "Q09666", 
"Q09666", "Q09666", "Q09666", "Q6P6C2", "E9PB61", "E9PB61"), 
    Site = c("E168", "E282", "E291", "E300", "E403", "E705", 
    "E545", "E550", "E574", "E766", "E796", "E797", "E924", "E1045", 
    "D1169", "E1173", "E1301", "E1422", "E4894", "E5219", "E5458", 
    "E5673", "E5689", "E5702", "E5703", "E5734", "E5755", "E5759", 
    "E50", "E249", "E250"), PMID = c(27256882L, 27256882L, 27256882L, 
    27256882L, 27256882L, 27256882L, 27256882L, 27256882L, 27256882L, 
    27256882L, 27256882L, 27256882L, 27256882L, 27256882L, 27256882L, 
    27256882L, 27256882L, 27256882L, 27256882L, 27256882L, 27256882L, 
    27256882L, 27256882L, 27256882L, 27256882L, 27256882L, 27256882L, 
    27256882L, 27256882L, 27256882L, 27256882L), Other_Sites = c("E20", 
    "E20", "E20", "E20", "E20", "E20", "E545", "E545", "E545", 
    "E545", "E545", "E545", "E545", "E545", "E545", "E545", "E545", 
    "E545", "E545", "E545", "E545", "E545", "E545", "E545", "E545", 
    "E545", "E545", "E545", "E50", "E249", "E249")), row.names = 100:130, class = "data.frame")

标签: rdataframeaggregate

解决方案


我们可以为每个组添加summarise 站点并将它们粘贴在一起,然后连接两个表以获得所需的输出。

library(dplyr)

df1 %>% 
  group_by(Uniprot.ID) %>% 
  mutate(Other_Sites=paste(Site, collapse=","))

#>   Uniprot.ID Site              Other_Sites
#> 1     Q09666 E545 E545,E550,E574,E766,E796
#> 2     Q09666 E550 E545,E550,E574,E766,E796
#> 3     Q09666 E574 E545,E550,E574,E766,E796
#> 4     Q09666 E766 E545,E550,E574,E766,E796
#> 5     Q09666 E796 E545,E550,E574,E766,E796
#> 6     Q8NE71 E403                E403,E705
#> 7     Q8NE71 E705                E403,E705

reprex 包(v0.3.0)于 2019 年 6 月 23 日创建

数据:

df1 <-  read.table(text="Uniprot.ID Site
                         Q8NE71     E403     
                         Q8NE71     E705     
                         Q09666     E545     
                         Q09666     E550     
                         Q09666     E574     
                         Q09666     E766     
                         Q09666     E796 ", header=T)

更新:

Site解决 OP 关于空条目的后续评论。

library(tidyverse)

df1 %>% 
  group_by(Uniprot.ID) %>% 
  mutate(Other_Sites=paste(unique(Site), collapse=",")) %>%
  mutate(Other_Sites=gsub("^,*|(?<=,),|,*$", "", 
                          str_remove_all(Other_Sites, if_else(Site==""," ", Site)),
                          perl=T))

#>    Uniprot.ID Site              Other_Sites
#> 1      Q8NE71 E403                     E705
#> 2      Q8NE71 E705                     E403
#> 3      Q09666 E545      E550,E574,E766,E796
#> 4      Q09666 E550      E545,E574,E766,E796
#> 5      Q09666 E574      E545,E550,E766,E796
#> 6      Q09666 E766      E545,E550,E574,E796
#> 7      Q09666 E796      E545,E550,E574,E766
#> 8      Q09666      E545,E550,E574,E766,E796
#> 9      Q09666 E796      E545,E550,E574,E766
#> 10     Q09666      E545,E550,E574,E766,E796
#> 11     Q10B12

reprex 包(v0.3.0)于 2019 年 6 月 23 日创建

示例数据:

df1 <- structure(list(Uniprot.ID = c("Q8NE71", "Q8NE71", "Q09666", "Q09666", 
                                     "Q09666", "Q09666", "Q09666", "Q09666",
                                     "Q09666", "Q09666", "Q10B12"), 
                      Site = c("E403", "E705", "E545", "E550", "E574", "E766",
                               "E796", "", "E796", "", "")), 
                 row.names = c(NA, -11L), class = "data.frame")

df1
#>    Uniprot.ID Site
#> 1      Q8NE71 E403
#> 2      Q8NE71 E705
#> 3      Q09666 E545
#> 4      Q09666 E550
#> 5      Q09666 E574
#> 6      Q09666 E766
#> 7      Q09666 E796
#> 8      Q09666     
#> 9      Q09666 E796
#> 10     Q09666     
#> 11     Q10B12

推荐阅读