Вот изящное data.table
решение.
Вы можете посчитать этот пост поучительным. Пример переполнения стека, иллюстрирующий tstrsplit
require(data.table)
df = data.table(sample=c("s1","s2","s3"),
SNP1=c("AA","CC","AT"),
SNP2=c("TT","AT","CC"),
SNP3=c("GG","AA","AA"))
# get the names of the relevant columns
x=grep("SNP",names(df),value = TRUE)
# split each column. The 'by' functionality will
# manage the stacking of the results.
df[,lapply(.SD,tstrsplit,'',fixed=TRUE),.SDcols=x,by=sample]
output:
|sample |SNP1 |SNP2 |SNP3 |
|:------|:----|:----|:----|
|s1 |A |T |G |
|s1 |A |T |G |
|s2 |C |A |A |
|s2 |C |T |A |
|s3 |A |C |A |
|s3 |T |C |A |
Если строки были фиксированной длины, но не обязательно длиной 2, это все равно, кажется, работает,Я НЕ проверял это на пустых строках. caveat emptor