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")

UPDATED Allele 列を抽出し、個々の文字に分割してから、それらの文字をデータ フレームの 2 つの列にします。

また

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 が提案するように、2 つの新しい列を元のデータ テーブルの列に接続します。

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

このためのもう1つのトリックは、を使用すること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

古い答え

すでに提示されている両方の選択肢に基づいて、ここに1行のバージョンがあります(データフレームの名前がであると仮定します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で1列を2列に分割する

于 2012-05-03T11:05:32.050 に答える