От длинного до широкого с несколькими столбцами

#r

Вопрос:

У меня есть фрейм данных со столбцами SampleID, методом, параметром и значением.

 set.seed(123)  mydata lt;- data.frame(sample_ID = rep(1:100, each=4),  method = rep(LETTERS[1:2], 100),  parameter = rep(c("M1","M2"),times=c(2,2)),  value = round(runif(100, min = 100, max = 5000)),   stringsAsFactors = FALSE)  

Этот фрейм данных организован в длинном формате, и я хотел бы преобразовать его в широкий формат следующим образом: идентификатор sample_ID должен быть идентификатором строки — теперь метод столбцов параметр должны быть объединены с соответствующим значением, т. е.

Sample_ID 1 имеет значение

  • 1509 для метода A и параметра M1
  • 3963 для метода B и параметра M1
  • 2104 для метода А и параметра М2
  • 4427 для метода В и параметра М2

Теперь я хотел бы преобразовать эти 4 строки в одну строку, как это:

 sample_ID = 1, A_M1 = 1509, B_M1 = 3963, A_M2 = 2104, B_M2 = 4427  

Следующая строка будет состоять из этих переменных с sample_ID = 2, …

Извините, но я не смог сделать это с помощью spread() или melt().

Заранее благодарю вас!

Ответ №1:

Использование tidyr::pivot_wider тебя могло бы сделать:

 tidyr::pivot_wider(mydata, names_from = c("method", "parameter"), values_from = value) #gt; # A tibble: 100 × 5 #gt; sample_ID A_M1 B_M1 A_M2 B_M2 #gt; lt;intgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; #gt; 1 1 1509 3963 2104 4427 #gt; 2 2 4708 323 2688 4473 #gt; 3 3 2802 2337 4788 2321 #gt; 4 4 3420 2906 604 4509 #gt; 5 5 1306 306 1707 4777 #gt; 6 6 4459 3495 3238 4972 #gt; 7 7 3313 3572 2766 3011 #gt; 8 8 1517 821 4819 4521 #gt; 9 9 3484 3998 221 2441 #gt; 10 10 3816 1160 1659 1235 #gt; # … with 90 more rows  

Ответ №2:

Использование dcast() пакета from data.table

 dcast(mydata, sample_ID~...)  

Если вы сначала преобразуете свой data.frame в data.table setDT() , вы можете выразить это с помощью соответствующей нотации data.table

 mydata[, dcast(.SD, sample_ID~...)]  

Комментарии:

1. Спасибо вам за ваш ответ!