如何解决在第一列保持不变的情况下在r中拆分字符串
标题可能需要一些编辑,因为我不确定如何有效地解释。
在这里,我有两列,第二列可能在同一行中有3个对象,但由“ |”分隔。我写了一个代码来拆分它们,并删除 MESH: 后写下一行,但是它在第一列中添加了额外的数字。第一行并不总是6位数字,因此我编写的函数在此没有帮助。这是示例数据
chem11
ChemicalID chem
1 C089250 MESH:D000075163|MESH:D000688|MESH:D005296
2 C114385 MESH:D009842|MESH:D010069
3 C114386 MESH:D009842
4 C434150 MESH:D006576
5 C434149 MESH:D006576
6 C000620092 MESH:D010793|MESH:D052117
7 C533344 MESH:D006576
8 C533345 MESH:D006576
9 C046983 MESH:D003630|MESH:D008727|MESH:D011239|MESH:D014750
10 C585814 MESH:D013876|MESH:D052117
11 C533898 MESH:D010455
12 C493119 MESH:D009281|MESH:D012717
13 C014305 MESH:D015107
14 C473129 MESH:D011092
21 C040211 MESH:D000630
22 C033472 MESH:D000166
23 C000599298 MESH:D000166|MESH:D010795
代码可以正常工作
# expand duplicated DrugBank IDs
chemtmp = vector('list',nrow(chem11))
for (i in 1:nrow(chem11)) chemtmp[[i]] = as.character(chem11[i,2])
names(chemtmp) = as.character(chem11[,1])
chemtmp = sapply(chemtmp,strsplit,split = '\\|')
tmp = unlist(chemtmp)
chem2 = data.frame(IDs = tmp,ChemicalID = names(tmp))
chem2[,1] = gsub('MESH:','',chem2[,1])
如果第一行的每个元素都为7位数字,则下一个代码可以使用,但是还有一些更长的代码,我无法解决。
String2=function(data,from,to)
{
B2=NULL
for(i in 1:length(data)){B2[[i]]=paste0(data[[i]][from:to],collapse = "")}
B2=unlist(B2)
return(B2)
}
ChemID=String2(B1,1,7)
预期输出应为
XXX YYY
1 C089250 D000075163
2 C089250 D000688
3 C089250 D005296
4 C114385 D009842
5 C114385 D010069
6 C114386 D009842
7 C434150 D006576
8 C434149 D006576
9 C000620092 D010793
10 C000620092 D052117
解决方法
您可以从"MESH:"
列中删除chem
部分,然后根据"|"
将数据分成不同的行。
library(dplyr)
chem11 %>%
mutate(chem = gsub('MESH:','',chem)) %>%
tidyr::separate_rows(chem,sep = '\\|')
# A tibble: 27 x 2
# ChemicalID chem
# <chr> <chr>
# 1 C089250 D000075163
# 2 C089250 D000688
# 3 C089250 D005296
# 4 C114385 D009842
# 5 C114385 D010069
# 6 C114386 D009842
# 7 C434150 D006576
# 8 C434149 D006576
# 9 C000620092 D010793
#10 C000620092 D052117
# … with 17 more rows
,
您可以在into = c(NA,"chem")
中设置separate()
删除"MESH:"
的一部分,而fill = "left"
是要处理一些以{{ 1}}。
chem
数据
"MESH:"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。