У меня есть эта таблица (data1) с четырьмя столбцами
SNP rs6576700 rs17054099 rs7730126
sample1 G-G T-T G-G
Мне нужно разделить столбцы 2–4 на два столбца каждый, чтобы в новом выводе было 7 столбцов. Нравится :
SNP rs6576700 rs6576700 rs17054099 rs17054099 rs7730126 rs7730126
sample1 G G T T C C
С помощью следующей функции я мог бы разделить все столбцы одновременно, но результат - не то, что мне нужно.
split <- function(x){
x <- as.character(x)
strsplit(as.character(x), split="-")
}
data2=apply(data1[,-1], 2, split)
data2
$rs17054099
$rs17054099[[1]]
[1] "T" "T"
$rs7730126
$rs7730126[[1]]
[1] "G" "G"
$rs6576700
$rs6576700[[1]]
[1] "C" "C"
В Stack Overflow я нашел метод для преобразования вывода strsplit в фрейм данных, но числа rs находятся в строках, а не в столбцах (я получил аналогичный результат с другими методами в этом потоке strsplit by row и распределить результаты по столбцам в data.frame)
> n <- max(sapply(data2, length))
> l <- lapply(data2, function(X) c(X, rep(NA, n - length(X))))
> data.frame(t(do.call(cbind, l)))
t.do.call.cbind..l..
rs17054099 T, T
rs7730126 G, G
rs2061700 C, C
Если я не использую функцию transpose (... (t (do.call ...), на выходе будет список, который я не могу записать в файл.
Я хотел бы иметь решение на R, чтобы сделать его частью конвейера.
Я забыл сказать, что мне нужно применить это к миллиону столбцов.
cSplit
намного проще. - person N8TRO   schedule 14.08.2015