r - 如何根据数据框中相邻单元格的值汇总数据
问题描述
我有一个名为 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]
}
目前我的代码只Site
向Other_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")
解决方案
我们可以为每个组添加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