Хотя на этот вопрос принят приемлемый ответ, я хотел бы предложить совершенно другой подход.
Если я правильно понимаю, ОП ищет способ легко сравнить значения в произвольных столбцах между различными исследованиями. В качестве дополнительной сложности имена произвольных столбцов заранее не известны.
Я предлагаю изменить данные соответствующим образом:
library(data.table)
library(magrittr)
melt(setDT(D), id.vars = c("study.name", "group.name"),
measure.vars = tail(names(D), -grep("autoreg", names(D))), na.rm = TRUE) %>%
dcast(variable + study.name ~ group.name)
variable study.name Cont.Long Cont.Long2 Cont.Short DCF.Long DCF.Long2 DCF.Short ME.long ME.long2 ME.short
1: ESL Ellis.sh1 1 NA 1 1 NA 1 1 NA 1
2: ESL Goey1 0 NA 0 0 NA 0 0 NA 0
3: ESL kabla 1 1 1 1 1 1 1 1 1
4: prof Ellis.sh1 2 NA 2 2 NA 2 2 NA 2
5: prof Goey1 1 NA 1 1 NA 1 1 NA 1
6: prof kabla 3 3 3 3 3 3 3 3 3
7: scope Ellis.sh1 0 NA 0 0 NA 0 0 NA 0
8: scope Goey1 1 NA 1 1 NA 1 1 NA 1
9: scope kabla 0 0 0 0 0 0 0 0 0
10: type Ellis.sh1 1 NA 1 1 NA 1 1 NA 1
11: type Goey1 0 NA 0 0 NA 0 0 NA 0
12: type kabla 1 1 1 1 1 1 1 1 1
В качестве произвольных столбцов (столбец variable
в измененном формате) все столбцы выбираются из D
, которые появляются после столбца autoreg
независимо от их имен на
tail(names(D), -grep("autoreg", names(D)))
Добавление
Обратите внимание, что имена столбцов взяты из group.name
и расположены в алфавитном порядке. Если требуется сохранить исходный порядок строк, в котором group.name
появился в D
, то уровни коэффициента group.name
необходимо соответствующим образом скорректировать:
library(data.table)
library(magrittr)
lvls <- D[study.name != "", 1:2] %>%
split(drop = TRUE, by = "study.name") %>%
.[lengths(.) %>% order() %>% rev()] %>% # merge longest first
Reduce(function(x, y) merge(x, y, by = "group.name", all = TRUE, sort = FALSE), .) %>%
.[, group.name %>% forcats::fct_drop() %>% forcats::fct_inorder()]
melt(setDT(D), id.vars = c("study.name", "group.name"),
measure.vars = tail(names(D), -grep("autoreg", names(D))), na.rm = TRUE) %>%
.[, group.name := factor(group.name, levels = lvls)] %>%
dcast(variable + study.name ~ group.name)
variable study.name ME.short ME.long ME.long2 DCF.Short DCF.Long DCF.Long2 Cont.Short Cont.Long Cont.Long2
1: ESL Ellis.sh1 1 1 NA 1 1 NA 1 1 NA
2: ESL Goey1 0 0 NA 0 0 NA 0 0 NA
3: ESL kabla 1 1 1 1 1 1 1 1 1
4: prof Ellis.sh1 2 2 NA 2 2 NA 2 2 NA
5: prof Goey1 1 1 NA 1 1 NA 1 1 NA
6: prof kabla 3 3 3 3 3 3 3 3 3
7: scope Ellis.sh1 0 0 NA 0 0 NA 0 0 NA
8: scope Goey1 1 1 NA 1 1 NA 1 1 NA
9: scope kabla 0 0 0 0 0 0 0 0 0
10: type Ellis.sh1 1 1 NA 1 1 NA 1 1 NA
11: type Goey1 0 0 NA 0 0 NA 0 0 NA
12: type kabla 1 1 1 1 1 1 1 1 1
Данные
Поскольку внешние ссылки в будущем могут прерваться, вот набор данных OP из ссылки github:
D <-
structure(list(study.name = structure(c(2L, 2L, 2L, 2L, 2L, 2L,
1L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
4L), .Label = c("", "Ellis.sh1", "Goey1", "kabla"), class = "factor"),
group.name = structure(c(10L, 8L, 7L, 5L, 4L, 2L, 1L, 10L,
8L, 7L, 5L, 4L, 2L, 1L, 10L, 8L, 9L, 7L, 5L, 6L, 4L, 2L,
3L), .Label = c("", "Cont.Long", "Cont.Long2", "Cont.Short",
"DCF.Long", "DCF.Long2", "DCF.Short", "ME.long", "ME.long2",
"ME.short"), class = "factor"), n = c(13L, 13L, 15L, 15L,
16L, 16L, NA, 13L, 13L, 15L, 15L, 16L, 16L, NA, 13L, 13L,
13L, 15L, 15L, 15L, 16L, 16L, 16L), mpre = c(0.34, 0.34,
0.37, 0.37, 0.32, 0.32, NA, 0.34, 0.34, 0.37, 0.37, 0.32,
0.32, NA, 0.34, 0.34, 0.34, 0.37, 0.37, 0.37, 0.32, 0.32,
0.32), mpos = c(0.72, 0.39, 0.54, 0.49, 0.28, 0.35, NA, 0.72,
0.39, 0.54, 0.49, 0.28, 0.35, NA, 0.72, 0.39, 0.39, 0.54,
0.49, 0.49, 0.28, 0.35, 0.35), sdpre = c(0.37, 0.37, 0.38,
0.38, 0.37, 0.37, NA, 0.37, 0.37, 0.38, 0.38, 0.37, 0.37,
NA, 0.37, 0.37, 0.37, 0.38, 0.38, 0.38, 0.37, 0.37, 0.37),
sdpos = c(0.34, 0.36, 0.36, 0.36, 0.36, 0.32, NA, 0.34, 0.36,
0.36, 0.36, 0.36, 0.32, NA, 0.34, 0.36, 0.36, 0.36, 0.36,
0.36, 0.36, 0.32, 0.32), control = c(FALSE, FALSE, FALSE,
FALSE, TRUE, TRUE, NA, FALSE, FALSE, FALSE, FALSE, TRUE,
TRUE, NA, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
TRUE, TRUE), post = c(1L, 2L, 1L, 2L, 1L, 2L, NA, 1L, 2L,
1L, 2L, 1L, 2L, NA, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L),
r = c(0.5, 0.5, 0.5, 0.5, 0.5, 0.5, NA, 0.5, 0.5, 0.5, 0.5,
0.5, 0.5, NA, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5
), autoreg = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
NA, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NA, FALSE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE),
ESL = c(1L, 1L, 1L, 1L, 1L, 1L, NA, 0L, 0L, 0L, 0L, 0L, 0L,
NA, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), prof = c(2L, 2L,
2L, 2L, 2L, 2L, NA, 1L, 1L, 1L, 1L, 1L, 1L, NA, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L), scope = c(0L, 0L, 0L, 0L, 0L, 0L,
NA, 1L, 1L, 1L, 1L, 1L, 1L, NA, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L), type = c(1L, 1L, 1L, 1L, 1L, 1L, NA, 0L, 0L, 0L,
0L, 0L, 0L, NA, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), class = "data.frame", row.names = c(NA,
-23L))
study.name group.name n mpre mpos sdpre sdpos control post r autoreg ESL prof scope type
1: Ellis.sh1 ME.short 13 0.34 0.72 0.37 0.34 FALSE 1 0.5 FALSE 1 2 0 1
2: Ellis.sh1 ME.long 13 0.34 0.39 0.37 0.36 FALSE 2 0.5 FALSE 1 2 0 1
3: Ellis.sh1 DCF.Short 15 0.37 0.54 0.38 0.36 FALSE 1 0.5 FALSE 1 2 0 1
4: Ellis.sh1 DCF.Long 15 0.37 0.49 0.38 0.36 FALSE 2 0.5 FALSE 1 2 0 1
5: Ellis.sh1 Cont.Short 16 0.32 0.28 0.37 0.36 TRUE 1 0.5 FALSE 1 2 0 1
6: Ellis.sh1 Cont.Long 16 0.32 0.35 0.37 0.32 TRUE 2 0.5 FALSE 1 2 0 1
7: NA NA NA NA NA NA NA NA NA NA NA NA NA
8: Goey1 ME.short 13 0.34 0.72 0.37 0.34 FALSE 1 0.5 FALSE 0 1 1 0
9: Goey1 ME.long 13 0.34 0.39 0.37 0.36 FALSE 2 0.5 FALSE 0 1 1 0
10: Goey1 DCF.Short 15 0.37 0.54 0.38 0.36 FALSE 1 0.5 FALSE 0 1 1 0
11: Goey1 DCF.Long 15 0.37 0.49 0.38 0.36 FALSE 2 0.5 FALSE 0 1 1 0
12: Goey1 Cont.Short 16 0.32 0.28 0.37 0.36 TRUE 1 0.5 FALSE 0 1 1 0
13: Goey1 Cont.Long 16 0.32 0.35 0.37 0.32 TRUE 2 0.5 FALSE 0 1 1 0
14: NA NA NA NA NA NA NA NA NA NA NA NA NA
15: kabla ME.short 13 0.34 0.72 0.37 0.34 FALSE 1 0.5 FALSE 1 3 0 1
16: kabla ME.long 13 0.34 0.39 0.37 0.36 FALSE 2 0.5 FALSE 1 3 0 1
17: kabla ME.long2 13 0.34 0.39 0.37 0.36 FALSE 3 0.5 FALSE 1 3 0 1
18: kabla DCF.Short 15 0.37 0.54 0.38 0.36 FALSE 1 0.5 FALSE 1 3 0 1
19: kabla DCF.Long 15 0.37 0.49 0.38 0.36 FALSE 2 0.5 FALSE 1 3 0 1
20: kabla DCF.Long2 15 0.37 0.49 0.38 0.36 FALSE 3 0.5 FALSE 1 3 0 1
21: kabla Cont.Short 16 0.32 0.28 0.37 0.36 TRUE 1 0.5 FALSE 1 3 0 1
22: kabla Cont.Long 16 0.32 0.35 0.37 0.32 TRUE 2 0.5 FALSE 1 3 0 1
23: kabla Cont.Long2 16 0.32 0.35 0.37 0.32 TRUE 3 0.5 FALSE 1 3 0 1
study.name group.name n mpre mpos sdpre sdpos control post r autoreg ESL prof scope type