R изменить, реструктурировать фрейм данных по блокам - PullRequest
3 голосов
/ 04 ноября 2011

Я пытаюсь изменить структуру данных:

В настоящее время это выглядит так:

ID   | Gender |A1 | A2 | A3 | B1 | B2 | B3
ID_1 | m      | 3 | 3  | 3  | 2  | 3  | 2 
ID_2 | f      | 1 | 1  | 1  | 4  | 4  | 4

Я хочу получить что-то вроде:

 ID   | Gender | A1 | A2 | A3
 ID_1 | m      | 3  | 3  |  3   <- this would be columns A1 - A3 for ID 1
 ID_1 | m      | 2  | 2  |  2   <- this would be columns B1 - B3 for ID 1
 ID_2 | f      | 1  | 1  |  1   <- this would be columns A1 - A3 for ID 2
 ID_2 | f      | 4  | 4  |  4   <- this would be columns B1 - B3 for ID 2

(A1и B1 / A2 и B2 являются одними и теми же переменными (в отношении содержимого), поэтому, например: A1 и B1 будут обеими переменными для результата теста 1, а A2 и B2 оба содержат результат теста 2. Таким образом, в порядкечтобы оценить его, мне нужны все результаты Test1 в одном столбце и все тесты 2. в другом столбце. Я пытался решить эту проблему с помощью «melt», но он только плавит кадры данных один за другим, а не как куски (поскольку яНужно оставить первые 2 столбца такими, какие они есть, и переставить только последние 4 столбца, но как куски из трех) Любые другие идеи? Спасибо!

Ответы [ 4 ]

5 голосов
/ 04 ноября 2011

Один лайнер с использованием reshape от базы R.

reshape(dat, varying = 3:8, idvar = 1:2, direction = 'long', drop=FALSE, 
   timevar = 'Test')

           ID Gender Test Test1 Test2 Test3
ID_1.m.A ID_1      m    A    A1    A2    A3
ID_2.f.A ID_2      f    A    A1    A2    A3
ID_1.m.B ID_1      m    B    B1    B2    B3
ID_2.f.B ID_2      f    B    B1    B2    B3
2 голосов
/ 04 ноября 2011

Как сказал @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
1 голос
/ 04 ноября 2011

Мне больше нравится ответ Брайана, но вот способ сделать это с помощью базового пакета.Хотя на мой взгляд довольно уродливо.

Ваш фрейм данных:

DF
        id    sex v1 v2 v3 v4 v5 v6
    1 ID_1   male A1 A2 A3 B1 B2 B3
    2 ID_2 female A1 A2 A3 B1 B2 B3

Код

DFa<-subset(DF, select=c(1:5))
DFb<-subset(DF, select=c(1:2, 6:8))
colnames(DFb)<-colnames(DFa)
DF<-as.data.frame(rbind(DFa,DFb))
rownames(DF)<-1:nrow(DF)
DF[order(DF$id),] 
0 голосов
/ 04 ноября 2011

Как насчет:

> dat <- data.frame(id=c("id1","id2"),gender=c("m","f"),a.1=1:2,a.2=1:2,a.3=1:2,b.1=3:4,b.2=3:4,b.3=3:4)
> dat1 <- dat[,-(3:5)]
> dat2 <- dat[,-(6:8)]
> names(dat1)[3:5] <- c("v1","v2","v3")
> names(dat2)[3:5] <- c("v1","v2","v3")
> 
> dat1$test <- "b"
> dat2$test <- "a"
> result <- rbind(dat1,dat2)
> dat
   id gender a.1 a.2 a.3 b.1 b.2 b.3
1 id1      m   1   1   1   3   3   3
2 id2      f   2   2   2   4   4   4
> result
   id gender v1 v2 v3 test
1 id1      m  3  3  3    b
2 id2      f  4  4  4    b
3 id1      m  1  1  1    a
4 id2      f  2  2  2    a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...