Сложное преобразование фрейма данных из длинного в широкое с использованием значений в нескольких «ключевых» столбцах в R - PullRequest
0 голосов
/ 18 января 2019

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

structure(list(study = structure(c(2L, 2L, 1L, 1L, 1L), .Label = c("Jones, 
1996", "Smith, 1999"), class = "factor"), group_allocation = 
structure(c(2L, 1L, 2L, 3L, 1L), .Label = c("control", "intervention_1", 
"intervention_2"), class = "factor"), outcome = structure(c(2L, 2L, 1L, 
1L, 1L), .Label = c("anxiety", "depression"), class = "factor"), bl_mean = 
c(6.5, 4.5, 3.7, 4.2, 5.3), fu_timepoint = c(6L, 6L, 12L, 12L, 12L), 
fu_mean = c(5.2, 7.5, 2.5, 2.7, 6.3), mean_diff = c(-2.3, NA, -3.8, -3.6, 
NA)), class = "data.frame", row.names = c(NA, -5L))

  study       group_allocation outcome bl_mean fu_timepoint fu_mean mean_diff
1 Smith, 1999 intervention_1 depression  6.5            6     5.2      -2.3
2 Smith, 1999 control        depression  4.5            6     7.5       NA
3 Jones, 1996 intervention_1 anxiety     3.7           12     2.5      -3.8
4 Jones, 1996 intervention_2 anxiety     4.2           12     2.7      -3.6
5 Jones, 1996 control        anxiety     5.3           12     6.3       NA

Моя проблема заключается в том, что мне нужно только одно наблюдение / строка для каждой группы вмешательства в столбце group_allocation (помеченные «вмешательство_1» и «вмешательство_2») для каждого исследования, и мне нужны данные контрольной группы (помеченные как «контроль» в столбец group_allocation) для перемещения в отдельные столбцы в тех же строках, что и каждая группа вмешательства, для анализа данных, сравнивая группы вмешательства с группами управления (по всему фрейму данных). Вот что я ищу:

structure(list(study = structure(c(2L, 1L, 1L), .Label = c("Jones, 1996", 
"Smith, 1999"), class = "factor"), ig_group_allocation = structure(c(1L, 
1L, 2L), .Label = c("intervention_1", "intervention_2"), class = 
"factor"), outcome = structure(c(2L, 1L, 1L), .Label = c("anxiety", 
"depression"), class = "factor"), ig_bl_mean = c(6.5, 3.7, 4.2), 
fu_timepoint = c(6L, 12L, 12L), ig_fu_mean = c(5.2, 2.5, 2.7), mean_diff = 
c(-2.3, -3.8, -3.6), cg_group_allocation = structure(c(1L, 1L, 1L), .Label 
= "control", class = "factor"), cg_bl_mean = c(4.5, 5.3, 5.3), cg_fu_mean 
= c(7.5, 6.3, 6.3)), class = "data.frame", row.names = c(NA, -3L))

study             ig_group_allocation outcome ig_bl_mean fu_timepoint ig_fu_meanmean_diff cg_group_allocation cg_bl_mean cg_fu_mean
1 Smith, 1999      intervention_1    depression     6.5            6        5.2      -2.3             control        4.5        7.5
2 Jones, 1996      intervention_1    anxiety        3.7           12        2.5      -3.8             control        5.3        6.3
3 Jones, 1996      intervention_2    anxiety        4.2           12        2.7      -3.6             control        5.3        6.3

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

Спасибо!

1 Ответ

0 голосов
/ 24 января 2019

Разделите ваши данные на два фрейма данных, один для элементов управления и один для вмешательств, а затем объедините их вместе.

df
        study group_allocation    outcome bl_mean fu_timepoint fu_mean mean_diff
1 Smith, 1999   intervention_1 depression     6.5            6     5.2      -2.3
2 Smith, 1999          control depression     4.5            6     7.5        NA
3 Jones, 1996   intervention_1    anxiety     3.7           12     2.5      -3.8
4 Jones, 1996   intervention_2    anxiety     4.2           12     2.7      -3.6
5 Jones, 1996          control    anxiety     5.3           12     6.3        NA

 interventions<-df[grep("intervention", df$group_allocation),]

 interventions
        study group_allocation    outcome bl_mean fu_timepoint fu_mean mean_diff
1 Smith, 1999   intervention_1 depression     6.5            6     5.2      -2.3
3 Jones, 1996   intervention_1    anxiety     3.7           12     2.5      -3.8
4 Jones, 1996   intervention_2    anxiety     4.2           12     2.7      -3.6


 controls<-df[grep("control", df$group_allocation),]

 controls
        study group_allocation    outcome bl_mean fu_timepoint fu_mean mean_diff
2 Smith, 1999          control depression     4.5            6     7.5        NA
5 Jones, 1996          control    anxiety     5.3           12     6.3        NA

 names(controls)<-paste0("cg_", names(controls)) #add cg prefix to colnames

 new_df<-merge(interventions, controls, by.x="study", by.y="cg_study", all.x=TRUE)

 new_df
        study group_allocation    outcome bl_mean fu_timepoint fu_mean mean_diff cg_group_allocation cg_outcome cg_bl_mean cg_fu_timepoint cg_fu_mean cg_mean_diff
1 Jones, 1996   intervention_1    anxiety     3.7           12     2.5      -3.8             control    anxiety        5.3              12        6.3           NA
2 Jones, 1996   intervention_2    anxiety     4.2           12     2.7      -3.6             control    anxiety        5.3              12        6.3           NA
3 Smith, 1999   intervention_1 depression     6.5            6     5.2      -2.3             control depression        4.5               6        7.5           NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...