【问题标题】:strsplit one column with exact information into two columnstr将具有确切信息的一列拆分为两列
【发布时间】:2023-03-24 12:25:01
【问题描述】:

我的数据如下所示:

    SNP Geno Allele
marker1   G1    AA
marker2   G1    TT
marker3   G1    TT
marker1   G2    CC
marker2   G2    AA
marker3   G2    TT
marker1   G3    GG
marker2   G3    AA
marker3   G3    TT

我希望它看起来像这样:

    SNP Geno Allele1 Allele2
marker1   G1       A       A
marker2   G1       T       T
marker3   G1       T       T
marker1   G2       C       C
marker2   G2       A       A
marker3   G2       T       T
marker1   G3       G       G
marker2   G3       A       A
marker3   G3       T       T

我正在使用这个:

strsplit(Allele, split extended = TRUE)

但这不起作用。我需要额外的命令吗?

【问题讨论】:

  • @Chase - 删除或更新死链接会很好。尤其是在投票时。
  • 正在更新一个两年多前的链接...请参阅 here 以获取有关包 reshape2 中的 colsplit 函数的参考。
  • @topchef - 更新了两年前的链接...互联网有时有一段有趣的历史...感谢您的提醒。

标签: r split


【解决方案1】:

另一种方法,从头到尾:

制作可重现的数据:

dat <- read.table(header = TRUE,  text = "SNP Geno    Allele
marker1 G1  AA
marker2 G1  TT
marker3 G1  TT
marker1 G2  CC
marker2 G2  AA
marker3 G2  TT
marker1 G3  GG
marker2 G3  AA
marker3 G3  TT")

更新提取等位基因列,将其拆分为单个字符,然后将这些字符分成数据框的两列:

任一

dat1 <- data.frame(t(matrix(
                     unlist(strsplit(as.vector(dat$Allele), split = "")), 
                     ncol = length(dat$Allele), nrow = 2)))

或遵循@joran的建议

dat1 <- data.frame(do.call(rbind, strsplit(as.vector(dat$Allele), split = "")))

那么

为新列添加列名:

names(dat1) <- c("Allele1", "Allele2")

按照@user1317221 的建议,将两个新列附加到原始数据表中的列:

dat3 <- cbind(dat$SNP, dat$Geno, dat1)
        dat$SNP dat$Geno Allele1 Allele2
1 marker1       G1       A       A
2 marker2       G1       T       T
3 marker3       G1       T       T
4 marker1       G2       C       C
5 marker2       G2       A       A
6 marker3       G2       T       T
7 marker1       G3       G       G
8 marker2       G3       A       A
9 marker3       G3       T       T

【讨论】:

  • 我试过你的代码,数据的形状是我想要的,但是等位基因1和等位基因2的字母不对。不知何故,R 没有正确拆分列。对于第二行,它应该是等位基因 1 和等位基因 2 的 A,而不是 A 和 T,这是错误的。
  • 我认为您可能想对strsplit 调用的结果执行类似do.call(rbind,...) 的操作。
  • @marie,对不起,我的错误。我现在已经更新了答案,现在的输出与你想要的完全匹配。
  • @joran 谢谢你,我对do.call 不是很熟悉,但它就像你说的那样工作并且节省了相当多的打字时间!
【解决方案2】:

试试:

Allele<-dat$Allele    
Allele1<-substr(Allele, start = 1, stop = 1)
Allele2<-substr(Allele, start = 2, stop = 2)

然后您可以将它们 cbind 在一起,或者您想将它们放在数据框中

编辑:

@Ben 是正确的,我已在上面为您更正了我的代码或使用 Ben 的建议

Allele1 &lt;- with(dat, substr(Allele, start = 1, stop = 1))

【讨论】:

  • 您的答案中的列引用不完整,您应该有类似Allele1 &lt;- with(dat, substr(Allele, start = 1, stop = 1)) 或Allele1 &lt;- substr(dat$Allele, start = 1, stop = 1) 的内容
  • 我试过你的代码,但“等位基因”列仍然没有分开。
  • 那么您会得到什么错误或结果?您是否意识到此代码生成了您想要的格式的两个新向量,它不会改变实际的等位基因列?
【解决方案3】:

另一个技巧是使用read.fwf。与read.table 等不同,read.fwf 没有text 参数,因此您需要使用textConnection:

# dat$Allele <- as.character(dat$Allele) # Necessary if it's a factor
cbind(dat[-3], 
      read.fwf(textConnection(dat$Allele), 
               widths = c(1, 1), col.names=c("Allele1", "Allele2")))
#       SNP Geno Allele1 Allele2
# 1 marker1   G1       A       A
# 2 marker2   G1       T       T
# 3 marker3   G1       T       T
# 4 marker1   G2       C       C
# 5 marker2   G2       A       A
# 6 marker3   G2       T       T
# 7 marker1   G3       G       G
# 8 marker2   G3       A       A
# 9 marker3   G3       T       T

旧答案

在已经提出的两种替代方案的基础上,这里有一个单行版本(假设您的数据框名为 dat。

transform(dat, Allele1 = substr(Allele, 1, 1), 
          Allele2 = substr(Allele, 2, 2))[-3]

这给了我们:

      SNP Geno Allele1 Allele2
1 marker1   G1       A       A
2 marker2   G1       T       T
3 marker3   G1       T       T
4 marker1   G2       C       C
5 marker2   G2       A       A
6 marker3   G2       T       T
7 marker1   G3       G       G
8 marker2   G3       A       A
9 marker3   G3       T       T

与this response 的概念完全相同,但使用的是transform。


更新(很久以后)

您还可以使用我的“splitstackshape”包中的cSplit,并带有参数stripWhite = FALSE。

例如,要拆分“等位基因”列,请尝试:

library(splitstackshape)
cSplit(dat, "Allele", "", stripWhite = FALSE)
#        SNP Geno Allele_1 Allele_2
# 1: marker1   G1        A        A
# 2: marker2   G1        T        T
# 3: marker3   G1        T        T
# 4: marker1   G2        C        C
# 5: marker2   G2        A        A
# 6: marker3   G2        T        T
# 7: marker1   G3        G        G
# 8: marker2   G3        A        A
# 9: marker3   G3        T        T

另见:Split one column to two columns in R with looping

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多