Выравнивание/расширение набора данных для отображения нескольких испытаний одного анализируемого вещества в одной строке

#r #flatten

Вопрос:

Я пытаюсь выровнять/расширить свой фрейм данных для сортировки по имени образца. По каждому отдельному образцу было проведено несколько испытаний, и я хотел бы объединить все испытания в один ряд.

Примеры данных:

 Sample_Name lt;- c("M1","M1","M1","M1","M2","M2","M2","M2") test_ID lt;- c("Gen1 Spec1", "Gen2 Spec2", "Gen2 Spec2", "Gen2 Spec2", "Gen3 Spec3", "Gen3 Spec3", "Gen4 Spec4", "Gen4 Spec4") MScore lt;- c(2.2, 1.9, 2.1, 2.0, 1.0, 2.0, 1.4, 1.5) Test_Data lt;-data.frame(Sample_Name, test_ID, MScore)  

Форма моего желаемого результата:

 Target_Sample_Name lt;-c("M1","M2") Trial_1_ID lt;-c("Gen1 Spec1", "Gen2 Spec2") Trial_1_Score lt;-c(2.2, 1.0) Trial_2_IDlt;-c("Gen2 Spec2", "Gen3 Spec3") Trial_2_Scorelt;-c(1.9, 2.0) Trial_3_IDlt;-c("Gen2 Spec2", "Gen4 Spec4" ) Trial_3_Scorelt;-c(2.1 , 1.4) Trial_4_IDlt;-c("Gen2 Spec2","Gen4 Spec4" ) Trial_4_Scorelt;-c(2.0, 1.5 ) Desired_Output lt;- data.frame(Target_Sample_Name, Trial_1_ID, Trial_1_Score, Trial_2_ID, Trial_2_Score, Trial_3_ID, Trial_3_Score, Trial_4_ID, Trial_4_Score)  

Я уверен, что есть лучший способ на самом деле показать, что я хочу сделать, но я супер новичок и еще не нашел его.

Я пытался использовать aggregate, но не могу понять, какое УДОВОЛЬСТВИЕ использовать. Я также пытался использовать функцию tibble pivot_wider, но не смог заставить ее работать. Я понимаю, что это довольно странный способ организации моих данных, но я обещаю, что это имеет смысл в контексте моего проекта!

Спасибо!

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

1. Я не уверен, но я думаю, что ваш желаемый результат неверен? Ибо M2 я получаю Gen3 Spec3 как Trail_1_ID вместо Gen2 Spec2 того, кому принадлежит M1 .

Ответ №1:

Вы могли бы использовать

 library(dplyr) library(tidyr)  Test_Data %gt;%   group_by(Sample_Name) %gt;%   mutate(rn = row_number()) %gt;%   pivot_wider(id_cols = Sample_Name,  names_from = rn,  names_glue = "{.value}_{rn}",  values_from = c("test_ID", "MScore")) %gt;%   rename_with(~gsub("test_ID_(\d )", "Trail_\1_ID", .x), starts_with("test_ID")) %gt;%   rename_with(~gsub("MScore_(\d )", "Trail_\1_Score", .x), starts_with("MScore")) %gt;%   select(colnames(.)[order(colnames(.))]) %gt;%  ungroup()  

Это возвращает

 # A tibble: 2 x 9  Sample_Name Trail_1_ID Trail_1_Score Trail_2_ID Trail_2_Score Trail_3_ID Trail_3_Score  lt;chrgt; lt;chrgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;chrgt; lt;dblgt; 1 M1 Gen1 Spec1 2.2 Gen2 Spec2 1.9 Gen2 Spec2 2.1 2 M2 Gen3 Spec3 1 Gen3 Spec3 2 Gen4 Spec4 1.4 # ... with 2 more variables: Trail_4_ID lt;chrgt;, Trail_4_Score lt;dblgt;