6

我的数据如下所示:

    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)

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

4

3 回答 3

12

另一种方法,从头到尾:

制作可重现的数据:

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
于 2012-05-02T21:45:46.353 回答
4

尝试:

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

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

编辑:

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

Allele1 <- with(dat, substr(Allele, start = 1, stop = 1))

于 2012-05-02T21:22:09.140 回答
2

另一个技巧是使用read.fwf. 不像read.tableand co.,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

它与此响应的概念完全相同,但使用transform.


更新(很久以后)

您也可以使用cSplit我的“splitstackshape”包中的参数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

另请参阅:使用循环将 R 中的一列拆分为两列

于 2012-05-03T11:05:32.050 回答