字符串分割并在定界符处展开(向量):R

4

我有一个很大的向量myvec,需要按照/进行分割并创建另一个结果向量resvector。在R中该如何实现?

myvec<-c("IID:WE:G12D/V/A","GH:SQ:p.R172W/G", "HH:WG:p.S122F/H")

resvector

IID:WE:G12D, IID:WE:G12V,IID:WE:G12A,GH:SQ:p.R172W,GH:SQ:p.R172G,HH:WG:p.S122F,HH:WG:p.S122H

你尝试过 ?strsplit 吗? - Tensibai
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - MAPK
3
resvector的末尾应该是一个 "H" 吗? - BenBarnes
1
@user277653 在这种情况下,展示(或至少谈论)你已经尝试过什么以及失败的地方。这表明在寻求免费代码之前,你已经尝试过一些东西 :) - Tensibai
@BenBarnes 你说得对!我已经纠正了。 - MAPK
3个回答

5
这里有一个简洁的答案,使用了正则表达式和一些函数式编程:
regex
x = gsub('[A-Z]/.+','',myvec)
y = strsplit(gsub('[^/]+(?=[A-Z]/.+)','',myvec, perl=T),'/')

unlist(Map(paste0, x, y))
# "IID:WE:G12D"   "IID:WE:G12V"   "IID:WE:G12A" "GH:SQ:p.R172W" "GH:SQ:p.R172G" "HH:WG:p.S122F" "HH:WG:p.S122H"

2
很高兴成为这个聪明的方式的一小部分,感到愉快 :-) - Cath

5
您可以尝试使用@Tensibai提到的strsplit
sp_vec <- strsplit(myvec, "/") # split the element of the vector by "/" : you will get a list where each element is the decomposition (vector) of one element of your vector, according to "/"
ts_vec <- lapply(sp_vec, # for each element of the previous list, do
                 function(x){
                     base <- sub("\\w$", "", x[1]) # get the common beginning of the column names (so first item of vector without the last letter)
                     x[-1] <- paste0(base, x[-1]) # paste this common beginning to the rest of the vector items (so the other letters)
                     x}) # return the vector
resvector <- unlist(ts_vec) # finally, unlist to get the needed vector

resvector
# [1] "IID:WE:G12D"   "IID:WE:G12V"   "IID:WE:G12A"   "GH:SQ:p.R172W" "GH:SQ:p.R172G" "HH:WG:p.S122F" "HH:WG:p.S122H"

2
@user277653,没问题,很高兴能帮到你。我添加了一些解释。 - Cath

1
myvec<-c("IID:WE:G12D/V/A","GH:SQ:p.R172W/G", "HH:WG:p.S122F/H")

custmSplit <- function(str){
  splitbysep <-  strsplit(str, '/')[[1]]
  splitbysep[-1] <- paste0(substr(splitbysep[1], 1, nchar(splitbysep[1])), splitbysep[-1])
  return(splitbysep)
}

do.call('c', lapply(myvec, custmSplit))
# [1] "IID:WE:G12D"    "IID:WE:G12DV"   "IID:WE:G12DA"   "GH:SQ:p.R172W"  "GH:SQ:p.R172WG" "HH:WG:p.S122F"  "HH:WG:p.S122FH"

1
你的代码虽然和我的很相似,但是不起作用:你需要加上 substr(splitbysep[1],1,nchar(splitbysep[1])-1) 才能得到期望的结果;substr(splitbysep[1],1,nchar(splitbysep[1]))splitbysep[1] 是一样的,哈哈。 - Cath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接