Skip Headers

SAS  SPSS  R-PROJECT  S-PLUS  PROC-SQL

통 계
프 로 그 램 비 교

Go to Documentation Home
HOME
Go to Book List
PRO_home
Go to Table of Contents
연구회
Go to Index
자료실
Go to Master Index
R-PROJECT
Go to Feedback page
MAIL

Go to previous page
Previous
Go to next page
Next

12. 변수를 관측치로 전치후 원상태로 복구

        (Reshaping Variables to Observations and Back)


1. SAS
2. SPSS
3. R-PROJECT
4. S-PLUS
5. PROC SQL

 


1. SAS

MAIN

* 데이터 전치를 위한 SAS 프로그램.

* 길이가 넓은 포맷을 긴 포맷으로 전치.;

data BACK.mydata;

     infile 'c:\data\mydata.csv' delimiter = ','

            MISSOVER DSD lrecl=32767 firstobs=2 ;

     input id workshop gender $ q1 q2 q3 q4;

run;

 

* 배열을 이용한 데이터 전치;

DATA mylong;

 SET BACK.mydata;

     ARRAY q{4} q1-q4;

     DO i=1 to 4;

        y=q{i};

        question=i;

        output;

     END;

     KEEP id workshop gender question y;

RUN;

PROC PRINT; RUN;

OBS    id    workshop    gender    y    question

  1     1        1         f       1        1

  2     1        1         f       1        2

  3     1        1         f       5        3

  4     1        1         f       1        4

  5     2        2         f       2        1

  6     2        2         f       1        2

  7     2        2         f       4        3

  8     2        2         f       1        4

  9     3        1         f       2        1

 10     3        1         f       2        2

 11     3        1         f       4        3

 12     3        1         f       3        4

 13     4        2         f       3        1

 14     4        2         f       1        2

 15     4        2         f       .        3

 16     4        2         f       3        4

 17     5        1         m       4        1

 18     5        1         m       5        2

 19     5        1         m       2        3

 20     5        1         m       4        4

 21     6        2         m       5        1

 22     6        2         m       4        2

 23     6        2         m       5        3

 24     6        2         m       5        4

 25     7        1         m       5        1

 26     7        1         m       3        2

 27     7        1         m       4        3

 28     7        1         m       4        4

 29     8        2         m       4        1

 30     8        2         m       5        2

 31     8        2         m       5        3

 32     8        2         m       5        4

 

* Transpose 프로시져를 사용한 데이터 전치;

proc transpose data=BACK.mydata

                 out =TRA_DAT(rename=(col1=y))

                 name=question;

     by id workshop gender;

     var q1-q4;

run;

PROC PRINT; RUN;

OBS    id    workshop    gender    question    y

  1     1        1         f          q1       1

  2     1        1         f          q2       1

  3     1        1         f          q3       5

  4     1        1         f          q4       1

  5     2        2         f          q1       2

  6     2        2         f          q2       1

  7     2        2         f          q3       4

  8     2        2         f          q4       1

  9     3        1         f          q1       2

 10     3        1         f          q2       2

 11     3        1         f          q3       4

 12     3        1         f          q4       3

 13     4        2         f          q1       3

 14     4        2         f          q2       1

 15     4        2         f          q3       .

 16     4        2         f          q4       3

 17     5        1         m          q1       4

 18     5        1         m          q2       5

 19     5        1         m          q3       2

 20     5        1         m          q4       4

 21     6        2         m          q1       5

 22     6        2         m          q2       4

 23     6        2         m          q3       5

 24     6        2         m          q4       5

 25     7        1         m          q1       5

 26     7        1         m          q2       3

 27     7        1         m          q3       4

 28     7        1         m          q4       4

 29     8        2         m          q1       4

 30     8        2         m          q2       5

 31     8        2         m          q3       5

 32     8        2         m          q4       5

 

PROC SORT DATA=mylong;

     BY id question;

RUN;

 

* 긴 포맷을 넓은 포맷으로 원상 복귀;

DATA mywide;

 SET mylong;

     BY id;

     RETAIN q1-q4;

     ARRAY q{*} q1-q4;

     IF FIRST.id THEN do;

        i=1;

        DO j=1 to 4;

           q{i}=.;

        END;

     end;

     q{i}=y;

     IF LAST.id THEN OUTPUT;

     i+1;

     DROP question y i j;

RUN;

PROC PRINT; RUN;

OBS    id    workshop    gender    q1    q2    q3    q4

 1      1        1         f        1     1     5     1

 2      2        2         f        2     1     4     1

 3      3        1         f        2     2     4     3

 4      4        2         f        3     1     .     3

 5      5        1         m        4     5     2     4

 6      6        2         m        5     4     5     5

 7      7        1         m        5     3     4     4

 8      8        2         m        4     5     5     5

* 긴 포맷을 넓은 포맷으로 원상 복귀;

proc transpose data=TRA_DAT

                 out =TRA_DAT1(drop=_NAME_);

     by id workshop gender;

     var y;

     id question;

run;

PROC PRINT; RUN;

 

OBS    id    workshop    gender    q1    q2    q3    q4

 1      1        1         f        1     1     5     1

 2      2        2         f        2     1     4     1

 3      3        1         f        2     2     4     3

 4      4        2         f        3     1     .     3

 5      5        1         m        4     5     2     4

 6      6        2         m        5     4     5     5

 7      7        1         m        5     3     4     4

 8      8        2         m        4     5     5     5



2. SPSS

MAIN

 

* 넓은 포맷을 긴 포맷으로 전치;

GET FILE='C:\mydata.sav'.

VARSTOCASES  /MAKE Y FROM q1 q2 q3 q4

 /INDEX = Question(4)

 /KEEP =  id workshop gender

 /NULL = KEEP.

SAVE OUTFILE='C:\data\mywide.sav'.

EXECUTE.

 

* 긴 포맷을 넓은 포맷으로 전치;

GET FILE='C:\data\mywide.sav'.

CASESTOVARS

 /ID = id workshop gender

 /INDEX = Question

 /GROUPBY = VARIABLE.

SAVE OUTFILE='C:\data\mylong.sav'.

EXECUTE.


3. R-PROJECT

MAIN

 

load(file="c:\\data/mydata.Rdata")

print(mydata)

 

# 이 예제를 위하여 ID변수가 필요.

# rownames를 이용하여 ID변수를 추출.

mydata$subject <- as.numeric( rownames(mydata) )

# 또는 아래와 같이 생성을 할수 있다.

mydata$subject <- 1:8

print(mydata)

workshop gender q1 q2 q3 q4 subject

1        1      f  1  1  5  1       1

2        2      f  2  1  4  1       2

3        1      f  2  2  4  3       3

4        2      f  3  1 NA  3       4

5        1      m  4  5  2  4       5

6        2      m  5  4  5  5       6

7        1      m  5  3  4  4       7

8        2      m  4  5  5  5       8

 

# 데이터 전치를 위하여 Reshape패키지의 melt함수 사용.

library(reshape)

mylong<-melt(mydata,id=c("subject","workshop","gender"))

print(mylong)

subject workshop gender variable value

1        1        1      f       q1     1

2        2        2      f       q1     2

3        3        1      f       q1     2

4        4        2      f       q1     3

5        5        1      m       q1     4

6        6        2      m       q1     5

7        7        1      m       q1     5

8        8        2      m       q1     4

9        1        1      f       q2     1

10       2        2      f       q2     1

11       3        1      f       q2     2

12       4        2      f       q2     1

13       5        1      m       q2     5

14       6        2      m       q2     4

15       7        1      m       q2     3

16       8        2      m       q2     5

17       1        1      f       q3     5

18       2        2      f       q3     4

19       3        1      f       q3     4

20       4        2      f       q3    NA

21       5        1      m       q3     2

22       6        2      m       q3     5

23       7        1      m       q3     4

24       8        2      m       q3     5

25       1        1      f       q4     1

26       2        2      f       q4     1

27       3        1      f       q4     3

28       4        2      f       q4     3

29       5        1      m       q4     4

30       6        2      m       q4     5

31       7        1      m       q4     4

32       8        2      m       q4     5

 

# Cast함수를 사용하여 세로 데이터를 가로 데이터로 전치.

# Value 변수 값이 변수들에 대한 측정값이 된다.

mywide<-cast(mylong, subject+workshop+gender~variable)

print(mywide)

subject workshop gender q1 q2 q3 q4

1       1        1      f  1  1  5  1

2       2        2      f  2  1  4  1

3       3        1      f  2  2  4  3

4       4        2      f  3  1 NA  3

5       5        1      m  4  5  2  4

6       6        2      m  5  4  5  5

7       7        1      m  5  3  4  4

8       8        2      m  4  5  5  5

 

 


4. S-PLUS

MAIN

[참 고]  http://www.biostat.wustl.edu/archives/html/s-news/2001-02/msg00195.html

 

mydata<-read.table ("c:/data/mydata.csv",header=TRUE,

  sep=",",row.names="id")

print(mydata)

 

* Reshape함수 생성.

reshape<-

function(obj, col.copy = NULL, col.unfold = 1:dim(obj)[2], label = "label",

value = "value")

{ n <- dim(obj)[1]

  p <- length(col.unfold)

  res <- vector("list", length(col.copy) + 2)

  names(res)<- c(if(is.null(col.copy)) NULL

else dimnames(obj[,col.copy,drop = F])[[2]], label, value)

  for(i in seq(along = col.copy)) { res[[i]] <- rep(obj[, col.copy[i]], p)

        }

      res[[label]] <- rep(dimnames(obj[, col.unfold, drop = F])[[2]],

rep(n, p))

       res[[value]] <- as.vector(data.matrix(obj[, col.unfold, drop = F]))

       as.data.frame(res)

}

 

trans1<- reshape(mydata,c(1:2,7),3:6)

print(trans1)

workshop gender subject label value

 1        1      f       1    q1     1

 2        2      f       2    q1     2

 3        1      f       3    q1     2

 4        2      f       4    q1     3

 5        1      m       5    q1     4

 6        2      m       6    q1     5

 7        1      m       7    q1     5

 8        2      m       8    q1     4

 9        1      f       1    q2     1

10        2      f       2    q2     1

11        1      f       3    q2     2

12        2      f       4    q2     1

13        1      m       5    q2     5

14        2      m       6    q2     4

15        1      m       7    q2     3

16        2      m       8    q2     5

17        1      f       1    q3     5

18        2      f       2    q3     4

19        1      f       3    q3     4

20        2      f       4    q3    NA

21        1      m       5    q3     2

22        2      m       6    q3     5

23        1      m       7    q3     4

24        2      m       8    q3     5

25        1      f       1    q4     1

26        2      f       2    q4     1

27        1      f       3    q4     3

28        2      f       4    q4     3

29        1      m       5    q4     4

30        2      m       6    q4     5

31        1      m       7    q4     4

32        2      m       8    q4     5

 

* Trans함수 생성;

table.trans<-

function(X, INDICES)

{

        len.ind <- length(INDICES)

        IN1 <- interaction(INDICES[ - len.ind], drop = T)

        IN2 <- INDICES[[len.ind]]

        a <- tapply(X, data.frame(IN1, IN2), c)    # browser()

        res <- cbind(INDICES[IN2 == levels(IN2)[1],  - len.ind], a)

        res

}

 

trans2<-table.trans(trans1$value,trans1[,c(1,2,3,4)])

print(trans2)

workshop gender subject q1 q2 q3 q4

1        1      f       1  1  1  5  1

2        2      f       2  2  1  4  1

3        1      f       3  2  2  4  3

4        2      f       4  3  1 NA  3

5        1      m       5  4  5  2  4

6        2      m       6  5  4  5  5

7        1      m       7  5  3  4  4

8        2      m       8  4  5  5  5

 

 


5. PROC SQL

MAIN