另一个技巧是使用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
旧答案
在已经提出的两种替代方案的基础上,这是一个单行版本(假设您的数据框名为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 中的一列拆分为两列