3

データフレームの形状を変更しようとしています。

現在、次のようになっています。

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の結果を含みます。それを評価するには、1つの列にTest1のすべての結果が必要であり、別の列にTest 2のすべての結果が必要です。これを「メルト」で解決しようとしましたが、データフレームを1つずつメルトダウンするだけで、チャンクとしてはメルトダウンしません。(最初の2列をそのままにして、最後の4列だけを再配置する必要があるので、3つのチャンクとして)他のアイデアはありますか?ありがとうございます!

4

4 に答える 4

5

reshapeベースRから使用する1つのライナー。

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
于 2011-11-04T16:07:24.507 に答える
2

@Andrieが言ったように、最初のステップは、指定された列(IDと性別)でデータを溶かすことです。あなたが言うように、あなたの問題は、どの列が「一緒に行く」かを特定することです。これが1つのアプローチで、最初はその情報を列名でエンコードし、そこから引き出します。

最初にいくつかのダミーデータ

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")

データを溶かしてから、variable2つの情報(テストとグループ)を含む列を取得し、それらの2ビットの情報を2つの別々の列に分割します。

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
于 2011-11-04T16:00:53.513 に答える
1

ブライアンの答えの方が好きですが、基本パッケージでそれを行う方法は次のとおりです。私の意見ではかなり醜いです。

データフレーム:

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),] 
于 2011-11-04T16:04:06.093 に答える
0

How about:

> 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
于 2011-11-04T16:03:13.253 に答える