分割向量时如何跳过R中的分隔符

r7xajy2e  于 2023-02-27  发布在  其他
关注(0)|答案(2)|浏览(118)

我有一个 Dataframe df。

df <- data.frame(SNP = c("chr2:178514676:CT:C", "chr2:178514676:CT:CTT", "chr2:178515045:T:<*:DEL>", "chr2:178515048:<*:DEL>:T"))

我想将df$SNP拆分为:,但如果有〈*:DEL〉,我想将其作为一个完整的元素保留。
结果df应包含另外4列:

SNP                    new_CHR new_POS    REF   ALT
chr2:178514676:CT:C    chr2   178514676   CT    C
chr2:178514676:CT:CTT    chr2   178514676   CT    CTT
chr2:178515045:T:<*:DEL>     chr2   178515045   T    <*:DEL>"
chr2:178515048:<*:DEL>:T    chr2   178515048   <*:DEL>    T

我创建了这样的四列,但不会给予正确的结果,因为<*:DEL>也会被拆分。
df$REF <- sapply(strsplit(df$SNP, split=":"), "[", 3)

jdgnovmf

jdgnovmf1#

一种选择是在管道中包含gsub步骤,而您有:

df %>% separate(SNP, into = c("new_CHR", "new_POS", "REF", "ALT"), sep = ":", extra = "merge")

您可以将其更改为:

df %>% 
  mutate(SNP = gsub(SNP, pattern='<*:DEL>', replacement = '<*DEL>',fixed=T),.keep='unused') %>% 
  separate(SNP, into = c("new_CHR", "new_POS","REF","ALT"), sep=":", extra='merge')

这只是将出现的“〈*:DEL〉”替换为“〈*DEL〉”,这样它就不会在分隔符上拆分。如果愿意,可以在separate函数后面包含另一个gsub,将冒号放回。

7rtdyuoh

7rtdyuoh2#

我们可以删除**mutate()**函数中的额外参数。因此,一个更简化的代码可能如下所示。

# We can use '<\\*:DEL>'instead of '<*DEL>' as we are not interested in substitution.

df %>% 
  mutate(SNP = gsub('<\\*:DEL>', '<*DEL>', SNP)) %>%
  separate(SNP, into = c("new_CHR", "new_POS","REF","ALT"), sep = ":", extra = "merge")

  new_CHR   new_POS    REF    ALT
1    chr2 178514676     CT      C
2    chr2 178514676     CT    CTT
3    chr2 178515045      T <*DEL>
4    chr2 178515048 <*DEL>      T

相关问题