Как мне написать write.table для сохранения данных каждого элемента списка в отдельной строке?
Допустим, у меня есть этот массив:
my.array <- array(1:48, dim=c(3,4,4))
И после некоторых неуклюжих преобразований я получаю следующие данные:
tarray <- apply(my.array, c(1,3), t)
listarray <-apply(tarray, 3, as.list)
ulist <- lapply(listarray, unlist)
trlist <- lapply(ulist, t)
[[1]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 4 7 10 2 5 8 11 3 6
[,11] [,12]
[1,] 9 12
[[2]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 13 16 19 22 14 17 20 23 15 18
[,11] [,12]
[1,] 21 24
[[3]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 25 28 31 34 26 29 32 35 27 30
[,11] [,12]
[1,] 33 36
[[4]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 37 40 43 46 38 41 44 47 39 42
[,11] [,12]
[1,] 45 48
Я хочу сохранить его, чтобы каждый элемент списка получал свою строку, т.е.
1 4 7 10 2 5 8 11 3 6 9 12
13 16 19 22 14 17 20 23 15 18 21 24
25 28 31 34 26 29 32 35 27 30 33 36
37 40 43 46 38 41 44 47 39 42 45 48
Но когда я использую write.table(trlist, file="test", sep="/t", row.names=FALSE,col.names = FALSE, quote = FALSE)
он просто сохраняет все в один ряд
1 ответ
Решение
Мы можем сделать это, пройдя по третьему измерению, извлекая my.array вдоль этого измерения, транспонируем, объединяем в vector
и преобразовать его в одну матрицу rbind
в list
элементы
do.call(rbind, lapply(seq(dim(my.array)[3]), function(i) c(t(my.array[,,i]))))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#[1,] 1 4 7 10 2 5 8 11 3 6 9 12
#[2,] 13 16 19 22 14 17 20 23 15 18 21 24
#[3,] 25 28 31 34 26 29 32 35 27 30 33 36
#[4,] 37 40 43 46 38 41 44 47 39 42 45 48
Или другой подход будет использовать aperm
а затем преобразовать его в matrix
matrix(c(aperm(my.array, c(2, 1, 3))), nrow = 4, byrow = TRUE)