このためのもう1つのトリックは、を使用することread.fwf
です。read.table
and 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列に分割する