Как я могу транспонировать каждый n-й (9-й) столбец в новую строку в R? - PullRequest
1 голос
/ 17 июня 2020

Я нашел несколько похожих вопросов, но не основанных на программировании R или не основанных на транспонировании на основе количества столбцов. Вот почему я пишу новый вопрос.

Итак, у меня есть данные в виде массива, как в этом воспроизводимом примере:

array <- structure(c(78, 101, 22, 22, 34, 64, 
                     68, 817, 44, 48, 42, 42, 44, 44, 
                     69, 78, 49, 62, 76, 92, 24, 24, 27, 36, 
                     61, 64, 44, 48, 43, 44, 42, 42, 66, 82, 
                     43, 56), .Dim = c(2L, 9L, 2L), .Dimnames = list(c("x", 
                                                                           "y"), NULL, NULL))

Таким образом, у меня есть такой массив:

, , 1

  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
x   78   22   34   68   44   42   44   69   49
y  101   22   64  817   48   42   44   78   62

, , 2

  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
x   76   24   27   61   44   43   42   66   43
y   92   24   36   64   48   44   42   82   56

Каждый столбец представляет отдельный образец (9 образцов). Они были повторены 100 раз, здесь я представляю всего 2 повтора. Кроме того, у меня больше строк (x, y, z, w ...).

Я хотел перенести каждый 9-й столбец в новую строку, поэтому в конце у меня будет 9 столбцов со 100 строками для x, за которыми следуют 100 строк для y, 100 строк для z et c. Примерно так:

  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
x   78   22   34   68   44   42   44   69   49
x   76   24   27   61   44   43   42   66   43
y  101   22   64  817   48   42   44   78   62
y   92   24   36   64   48   44   42   82   56

Это может быть data.frame, matrix et c. Это не имеет особого значения, я просто планирую потом экспортировать в формат csv.

1 Ответ

3 голосов
/ 17 июня 2020

Вы можете разделить массив по строкам, связать по столбцам и транспонировать:

t(do.call(cbind, asplit(my_array, 1)))

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]   78   22   34   68   44   42   44   69   49
[2,]   76   24   27   61   44   43   42   66   43
[3,]  101   22   64  817   48   42   44   78   62
[4,]   92   24   36   64   48   44   42   82   56

Чтобы переназначить имена строк, используйте:

`row.names<-`(t(do.call(cbind, asplit(my_array, 1))), rep(row.names(my_array), each = nrow(my_array)))

Или альтернативно:

apply(asplit(my_array, 1:2), 2, unlist)
...