Как сказал @Andrie, первым шагом является объединение данных с заданными вами столбцами (ID и пол). Ваша проблема, как вы говорите, состоит в том, чтобы определить, какие столбцы затем «идут вместе». Вот один из подходов: изначально кодировать эту информацию в именах столбцов, а затем извлекать ее оттуда.
Первые фиктивные данные
dat <- data.frame(ID=c("ID_1", "ID_2"), Gender=c("m","f"),
Test1.A = "A1", Test2.A = "A2", Test3.A = "A3",
Test1.B = "B1", Test2.B = "B2", Test3.B = "B3", stringsAsFactors=FALSE)
Обратите внимание, что я назвал столбцы именем, которое систематически указывает, к какому тесту и какой группе он относится.
> dat
ID Gender Test1.A Test2.A Test3.A Test1.B Test2.B Test3.B
1 ID_1 m A1 A2 A3 B1 B2 B3
2 ID_2 f A1 A2 A3 B1 B2 B3
Использование пакета reshape2
library("reshape2")
Расплавить данные, а затем взять столбец variable
, в котором есть два фрагмента информации (тест и группа), и разделить эти два бита информации на два отдельных столбца.
dat.m <- melt(dat, id.vars=c("ID", "Gender"))
dat.m <- cbind(dat.m, colsplit(dat.m$variable, "\\.", names=c("Test", "Group")))
Теперь разыграть легко, поскольку тест и группа разделены.
dcast(dat.m, ID+Gender+Group~Test)
Что дает
> dcast(dat.m, ID+Gender+Group~Test)
ID Gender Group Test1 Test2 Test3
1 ID_1 m A A1 A2 A3
2 ID_1 m B B1 B2 B3
3 ID_2 f A A1 A2 A3
4 ID_2 f B B1 B2 B3