Пытаясь переставить таблицу в R. (я новичок!), Есть ли какая-нибудь функция транспонирования? - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь переставить таблицу в R.

У меня (в качестве примера) 52 отдельных льва. Каждый лев был измерен на 92 различных маркера на образцах крови, взятых в течение 4 временных точек. На данный момент у меня есть столбец для идентификатора льва, длина которого составляет 208 строк, так как он расположен рядом со столбцом «номер образца», который обозначает момент времени, когда он был взят, время 1,2,3,4. Тогда есть значения из образца крови от 92 различных маркеров. Таким образом, всего 94 столбца (ID, номер образца и тип маркера).

См. Данные:

'ID' 'Sample Number' 'Marker type'
-Lion 1 time 1 Marker 1 Marker 2 Marker 3...Marker 92 
-Lion 1 time 2 Marker 1 Marker 2 Marker 3...Marker 92
-Lion 1 time 3 Marker 1 Marker 2 Marker 3...Marker 92
-Lion 1 time 4 Marker 1 Marker 2 Marker 3...Marker 92
-Lion 2 time 1 Marker 1 Marker 2 Marker 3...Marker 92
-Lion 2 time 2 Marker 1 Marker 2 Marker 3...Marker 92
-Lion 2 time 3 Marker 1 Marker 2 Marker 3...Marker 92
-Lion 2 time 4 Marker 1 Marker 2 Marker 3...Marker 92
-Lion 3 time 1 Marker 1 Marker 2 Marker 3...Marker 92
-Lion 3 time 2 Marker 1 Marker 2 Marker 3...Marker 92
-Lion 3 time 3 Marker 1 Marker 2 Marker 3...Marker 92
-Lion 3 time 4 Marker 1 Marker 2 Marker 3...Marker 92

Мне нужно изменить его, чтобы он содержал столбец для 52 идентификаторов льва (а не 4 строки на льва), а затем для каждых 92 маркеров, 4 столбца для номера выборки, что в сумме дает 369 столбцов.

Ожидаемые выходные данные:

'ID' 'Sample Number' 'Marker type'    
 lion 1 time 1 marker 1 time 2 marker 1 time 3 marker 1 time 4 marker 1
 lion 2 time 1 marker 2 time 2 marker 2 time 3 marker 2 time 4 marker 2
 lion 3 time 1 marker 3 time 2 marker 3 time 3 marker 3 time 4 marker 3

Я не особо хочу создавать новую переменную времени 1 для маркера 1, а скорее столбец для маркера 1, разбитый на 4 столбца времени , с 1 рядом для льва. То же самое для маркера 2 и так далее.

1 Ответ

0 голосов
/ 15 января 2020

Я думаю, что мы можем использовать pivot_wider здесь:

tidyr::pivot_wider(df, names_from = Samp_Num, values_from = Mark1:Mark3))
#OR
#tidyr::pivot_wider(df, names_from = Samp_Num, values_from = starts_with("Mark"))

# A tibble: 3 x 13
#  ID    Mark1_time1 Mark1_time2 Mark1_time3 Mark1_time4 Mark2_time1 Mark2_time2
#  <fct> <fct>       <fct>       <fct>       <fct>       <fct>       <fct>      
#1 Lion1 Marker1     Marker1     Marker1     Marker1     Marker2     Marker2    
#2 Lion2 Marker1     Marker1     Marker1     Marker1     Marker2     Marker2    
#3 Lion3 Marker1     Marker1     Marker1     Marker1     Marker2     Marker2    
# … with 6 more variables: Mark2_time3 <fct>, Mark2_time4 <fct>,
#   Mark3_time1 <fct>, Mark3_time2 <fct>, Mark3_time3 <fct>, Mark3_time4 <fct>

В моих выборочных данных у нас есть 3 столбца Mark, и теперь у нас есть 13 столбцов в конечном выводе (3 * 4 для каждого времени + 1) , Аналогично, для ваших фактических данных у вас должно быть 369 столбцов (92 * 4 + 1).

data

Создан небольшой пример данных

df <- structure(list(ID = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
3L, 3L, 3L, 3L), .Label = c("Lion1", "Lion2", "Lion3"), class = "factor"), 
Samp_Num = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 
2L, 3L, 4L), .Label = c("time1", "time2", "time3", "time4"
), class = "factor"), Mark1 = structure(c(1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "Marker1", class = "factor"), 
Mark2 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), .Label = "Marker2", class = "factor"), Mark3 = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "Marker3", class = "factor")),
class = "data.frame", row.names = c(NA, -12L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...