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

1. 변수 선택하기


SAS와 SPSS에서 모형에 대한 변수 선택은 간단하지만, 관측치 선택은 다소 복잡하다.(PROC IML로 극복가능)

그러나, R-Project와 S-PLUS는 변수나 관측치 선택은 거의 동일하다.


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

1. SAS

MAIN

* 변수 선택을 위한 SAS프로그램

* 최종 데이터를 BACK.mydata로 지정;

libname 'c:\data';

OPTIONS _LAST_=BACK.mydata;

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 PRINT;

      VAR workshop gender q1 q2 q3 q4;

RUN;

OBS    workshop    gender    q1    q2    q3    q4

 1         1         f        1     1     5     1

 2         2         f        2     1     4     1

 3         1         f        2     2     4     3

 4         2         f        3     1     .     3

 5         1         m        4     5     2     4

 6         2         m        5     4     5     5

 7         1         m        5     3     4     4

 8         2         m        4     5     5     5

 

* workshop과 q4사이의 모든 변수 선택;

PROC PRINT;

      var workshop--q4;

RUN;

OBS    workshop    gender    q1    q2    q3    q4

 1         1         f        1     1     5     1

 2         2         f        2     1     4     1

 3         1         f        2     2     4     3

 4         2         f        3     1     .     3

 5         1         m        4     5     2     4

 6         2         m        5     4     5     5

 7         1         m        5     3     4     4

 8         2         m        4     5     5     5

 

* q로 시작되는 변수 선택;

PROC PRINT;

      var workshop gender q1-q4;

RUN;

OBS    workshop    gender    q1    q2    q3    q4

 1         1         f        1     1     5     1

 2         2         f        2     1     4     1

 3         1         f        2     2     4     3

 4         2         f        3     1     .     3

 5         1         m        4     5     2     4

 6         2         m        5     4     5     5

 7         1         m        5     3     4     4

 8         2         m        4     5     5     5

 

* 선택된 변수를 가진 데이터 생성하기.;

* q로 시작되는 모든 변수 선택;

DATA BACK.myqs;

 SET BACK.mydata(KEEP=q:);

RUN;

PROC PRINT DATA=BACK.myqs;

RUN;

OBS    q1    q2    q3    q4

 1      1     1     5     1

 2      2     1     4     1

 3      2     2     4     3

 4      3     1     .     3

 5      4     5     2     4

 6      5     4     5     5

 7      5     3     4     4

 8      4     5     5     5

 

맨 위로 이동 맨 위로 이동


2. SPSS

MAIN

* 변수 선택을 위한 SPSS프로그램.

 

LIST.

LIST VARIABLES=workshop,gender,q1,q2,q3,q4.

LIST VARIABLES=workshop TO q4.

 

* 선택된 변수로 데이터 세트 생성.

SAVE OUTFILE='c:\myqs.sav' /KEEP=q1 TO q4.

EXECUTE.

 

맨 위로 이동 맨 위로 이동


3. R-PROJECT

MAIN

 

* 변수 선택을 위한 R-Project프로그램.

* 기본적으로 인덱스를 사용하여 변수를 지정할수 있다.

# 데이터 로드하기.

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

# 모든 데이터 출력하기.

print(mydata)

 workshop gender q1 q2 q3 q4
1       1      f  1  1  5  1
2       2      f  2  1  4  1
3       1      f  2  2  4  3
4       2      f  3  1 NA  3
5       1      m  4  5  2  4
6       2      m  5  4  5  5
7       1      m  5  3  4  4
8       2      m  4  5  5  5

 

#---INDEX를 사용한 변수 선택

# 모든 변수 선택하기.

print( mydata[ ])

print( mydata[ , ] )

 

# 3번째 변수(q1) 선택.

print(mydata[3])

q1

1  1

2  2

3  2

4  3

5  4

6  5

7  5

8  4

 

# 인덱스를 사용하여서 변수 q1,q2,q3,q4 선택하기 위한 방법.

print( mydata[ c(3,4,5,6) ] ) # 인덱스 사용.

print( mydata[ 3:6 ] )        # “:” 인식자 사용하여 인덱스 생성.

print( mydata[ -c(1,2) ] )    # 첫번째,두번째 변수를 제외.

print( mydata[ -I(1:2) ] )    # colon 인식자를 사용하여 변수 제외.

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

# 반복하여서 열의 범위를 이용한다면, Numeric 벡터에 전체 범위를 저장하면 유용.

myindexes <- 3:6

# 인덱스 확인

print( myindexes )

[1] 3 4 5 6

 

print( mydata[myindexes] )

  q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

# 마이너스 부호를 이용하여 3:6 변수 제외

print( mydata[-myindexes] )

     workshop gender

1        1      f

2        2      f

3        1      f

4        2      f

5        1      m

6        2      m

7        1      m

8        2      m

 

# '%in%' 함수는 이름의 전체 벡터를 비교하여 일치여부를 반환한다.

names(mydata) %in% c("q1","q2","q3","q4")

FALSE FALSE  TRUE  TRUE  TRUE  TRUE

 

# 'which' 함수는 TRUE인 인덱스 번호를 출력한다.

# myvar 변수에 단일 인덱스를 저장.

myvars <- which( names(mydata) %in% c("q1","q2","q3","q4") )

print(myvars)

[1] 3 4 5 6

 

print( mydata[ ,myvars] )

   q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

# 모든 변수에 대한 인덱스를 출력.

# 열 이름은 문자 벡터로써 mydata에 저장되어 있다.

# names함수로 변수이름을 출력하고, data.frame함수 데이터 프레임을 생성.

print( data.frame( myvars=names(mydata) ) )

    myvars

1 workshop

2   gender

3       q1

4       q2

5       q3

6       q4

 

#--- 변수명에 의해 변수 선택하기(minus 부호는 사용 불가)

# q1변수 선택.

mydata["q1"]

# q 변수 선택

mydata[ c("q1","q2","q3","q4") ]

q1

1  1

2  2

3  2

4  3

5  4

6  5

7  5

8  4

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

# subset함수는 colon 인식자를 이용하여서 쉽게 연속된 변수를 선택한다.

print( subset(mydata, select=q1:q4) )

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

# 변수명의 리스트를 저장하여 이용.

myQnames<-c("q1","q2","q3","q4")

print(myQnames) #변수명 출력.

print(mydata[myQnames])

[1] "q1" "q2" "q3" "q4"

  q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

# 이 프로그램 역시 변수명의 리스트를 저장하는 방법이나,

# 형태 1:4로부터 자동으로 생성된 연속적인 1,2,3,4 를 문자 q에 붙여서 변수명을 생성한다.

myQnames <-paste( "q", 1:4, sep="")

print(myQnames)         # 변수명 출력

print(mydata[myQnames]) # 선택된 변수 출력

[1] "q1" "q2" "q3" "q4"

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

# 인덱스에 의해 연속적인 변수 선택을 다시 설명.

# 여기서 변수명에 의해 인덱스를 얻는 방법을 다시 반복.

print(mydata[,3:6])

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

# 단독 Number를 가진 numeric 벡터에 단독 인덱스 값을 저장.

myA <- which( names(mydata)=="q1" )

print(myA) #숫자 3 출력.

myZ <- which( names(mydata)=="q4" )

print(myZ) #숫자 6을 출력.

print(mydata[ ,myA:myZ ]) # 변수 3에서 6번째 변수를 출력.

[1] 3

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

[1] 6

 

#---로직에 의해 변수 선택

# “==” 인식자는 벡터의 모든 멤버를 값과 비교하여서, TRUE/FALSE 값의 논리 벡터로 반환한다.

# 벡터는 변수를 선택하기 위해 이용된다.

# 벡터의 Length는 변수의 수와 일치하여서, 데이터 프레임 mydata에서 변수로써 저장될수 없다.

# 단지 워크스페이스에 저장된다.

 

# 수동적으로 변수 q1을 가진 벡터를 생성.

# as.logical함수는 1&0의 논리값을 TRUE & FALSE값으로 변경.

myq <- as.logical( c(0,0,1,0,0,0) )

print(myq)  # TRUE/FALSE 값 출력.

print( mydata[ myq ] ) #변수 q1출력.

[1] FALSE FALSE  TRUE FALSE FALSE FALSE

q1

1  1

2  2

3  2

4  3

5  4

6  5

7  5

8  4

 

# 자동적으로 같은 논리 벡터를 생성.

myq <- names(mydata)=="q1"

print(myq)

print( mydata[ myq ] )

[1] FALSE FALSE  TRUE FALSE FALSE FALSE

q1

1  1

2  2

3  2

4  3

5  4

6  5

7  5

8  4

 

# OR 인식자(“|”)를 이용하여서 q1에서 q4의 변수 선택,

# 결과를 myqs에 논리 벡터를 저장.

myqs <- names(mydata)=="q1" |

     names(mydata)=="q2" |

        names(mydata)=="q3" |

        names(mydata)=="q4"

print(myqs)

print( mydata[myqs] )

[1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

# %in% 연산자를 이용하여서 q1 에서 q4의 변수 선택.

# 위의 OR 연산자를 이용하는 것보다 간단.

myqs <- names(mydata) %in% c("q1","q2","q3","q4")

print(myqs)

print( mydata[myqs] )

[1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

# mydata를 접근하기 위해서 attach함수를 이용하면,

# 단독적으로 변수 q1을 조회할수 있지만, 후에 data frame을 detach해야한다.

# 데이터를 읽기 위해서는 편하지만, 권장하지 않는 방법.

attach(mydata)

print(gender)

print(q1)

print( data.frame(q1,q2,q3,q4) )

[1] f f f f m m m m

Levels: f m

q1 q2 q3 q4

1  1  1  5  1             

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

[1] 1 2 2 3 4 5 5 4

 

#--- 선택된 변수의 새 데이터 프레임 생성.

# 새로운 데이터 프레임에 위에서 선택된 변수를 저장. 아래 4개의 결과는 서로 같다.

myqs <- mydata[3:6]

myqs <- mydata[ c("q1","q2","q3","q4") ]

myqs <- data.frame(q1,q2,q3,q4)

myqs <- subset(mydata, select=q1:q4)

print(myqs)

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

 

맨 위로 이동 맨 위로 이동


4. S-PLUS

MAIN

 

* 기본적으로 인덱스를 사용하여 변수를 지정할수 있다.

#---INDEX를 사용한 변수 선택

# 모든 변수 선택.

print( mydata[ ])

print( mydata[ , ] )

   workshop gender q1 q2 q3 q4

1        1      f  1  1  5  1

2        2      f  2  1  4  1

3        1      f  2  2  4  3

4        2      f  3  1 NA  3

5        1      m  4  5  2  4

6        2      m  5  4  5  5

7        1      m  5  3  4  4

8        2      m  4  5  5  5

 

# 변수 q1 선택.

print( mydata[3] )

q1

1  1

2  2

3  2

4  3

5  4

6  5

7  5

8  4

 

print( mydata[ c(3,4,5,6) ] ) # 인덱스에 의해 q변수 선택.

print( mydata[ 3:6 ] )        # “:” 연산자를 이용하여 인덱스 생성.

print( mydata[ -c(1,2) ] )    # 다른 변수를 제외하고, q변수 선택.

print( mydata[ -I(1:2) ] )    # colon 연산자를 이용하여 변수 제외.

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

myindexes <- 3:6

print( myindexes ) # 지정한 인덱스 확인.

[1] 3 4 5 6

 

print( mydata[myindexes] )

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

# 음수 부호를 이용하여 3:6 변수 제외.

print( mydata[-myindexes] )

workshop gender

1        1      f

2        2      f

3        1      f

4        2      f

5        1      m

6        2      m

7        1      m

8        2      m

 

myvars <- index.rowcol( mydata,c(names(mydata) %in% c("q1","q2","q3","q4")))

print(myvars)

[1] 3 4 5 6

 

print( mydata[ ,myvars] )

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

print( data.frame( myvars=names(mydata) ) )

    myvars

1 workshop

2   gender

3       q1

4       q2

5       q3

6       q4

 

# q1변수 선택.

mydata["q1"]

  q1

1  1

2  2

3  2

4  3

5  4

6  5

7  5

8  4

 

# q 변수 선택.

mydata[ c("q1","q2","q3","q4") ]

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

data.frame(mydata)[,index.rowcol( mydata,c(names(mydata) %in% c("q1","q2","q3","q4")))]

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

myQnames<-c("q1","q2","q3","q4")

print(myQnames) # 지정한 변수명 출력.

[1] "q1" "q2" "q3" "q4"

 

print(mydata[myQnames])

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

# 지정한 변수명 출력.

myQnames <-paste( "q", 1:4, sep="")

print(myQnames)

[1] "q1" "q2" "q3" "q4"

 

# 선택된 변수 출력.

print(mydata[myQnames])

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

print(mydata[,3:6])

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

myA <- which( names(mydata)=="q1" )

print(myA) # q1변수의 위치 출력.

[1] 3

 

myZ <- which( names(mydata)=="q4" )

print(myZ) # 변수 q4의 위치 출력.

[1] 6

 

# 3번째에서 6번째까지의 변수 출력.

print(mydata[ ,myA:myZ ])

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

myq <- as.logical( c(0,0,1,0,0,0) )

print(myq) # 논리값 T/F값출력.

[1] F F T F F F

 

print( mydata[ myq ] ) # 3번째 변수 q1 출력.

 q1

1  1

2  2

3  2

4  3

5  4

6  5

7  5

8  4

 

myq <- names(mydata)=="q1"

print(myq)

[1] F F T F F F

 

print( mydata[ myq ] )

 q1

1  1

2  2

3  2

4  3

5  4

6  5

7  5

8  4

 

myqs <- names(mydata)=="q1" |

      names(mydata)=="q2" |

        names(mydata)=="q3" |

        names(mydata)=="q4"

print(myqs)

[1] F F T T T T

 

print( mydata[myqs] )

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

myqs <- names(mydata) %in% c("q1","q2","q3","q4")

print(myqs)

[1] F F T T T T

 

print( mydata[myqs] )

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

attach(mydata)

print(gender)

[1] f f f f m m m m

 

print(q1)

1 2 3 4 5 6 7 8

1 2 2 3 4 5 5 4

 

print( data.frame(q1,q2,q3,q4) )

  q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

myqs <- mydata[3:6]

myqs <- mydata[ c("q1","q2","q3","q4") ]

myqs <- data.frame(q1,q2,q3,q4)

myqs <- data.frame(mydata)[,index.rowcol( mydata,c(names(mydata) %in% c("q1","q2","q3","q4")))]

print(myqs)

q1 q2 q3 q4

1  1  1  5  1

2  2  1  4  1

3  2  2  4  3

4  3  1 NA  3

5  4  5  2  4

6  5  4  5  5

7  5  3  4  4

8  4  5  5  5

 

 

맨 위로 이동 맨 위로 이동


5. PROC SQL

MAIN

 

* 기본적으로 Select구문안에서 변수 선택이 가능하고, 데이터 세트에 Keep, Drop 옵션을 지정하여서 변수 선택 가능.

proc sql;

  select *

  from   BACK.Mydata;

quit;

id  workshop  gender        q1        q2        q3        q4

------------------------------------------------------------

 1         1  f              1         1         5         1

 2         2  f              2         1         4         1

 3         1  f              2         2         4         3

 4         2  f              3         1         .         3

 5         1  m              4         5         2         4

 6         2  m              5         4         5         5

 7         1  m              5         3         4         4

 8         2  m              4         5         5         5

 

* q변수만을 선택후에 q1,q2,q3,q4변수를 지정하여 출력.

proc sql;

  select q1,q2,q3,q4

  from   BACK.Mydata(keep=q:);

quit;

q1        q2        q3        q4

---------------------------------

  1         1         5         1

  2         1         4         1

  2         2         4         3

  3         1         .         3

  4         5         2         4

  5         4         5         5

  5         3         4         4

  4         5         5         5

 

* 세개의 변수를 삭제후 출력.

proc sql;

  select *

  from   BACK.Mydata(drop=id workshop gender);

quit;

q1        q2        q3        q4

---------------------------------

  1         1         5         1

  2         1         4         1

  2         2         4         3

  3         1         .         3

  4         5         2         4

  5         4         5         5

  5         3         4         4

  4         5         5         5

 

* q변수 전체를 선택후 출력.

proc sql;

  select *

  from   BACK.Mydata(keep=q:);

quit;

 

* 전체 변수 선택후 q변수만을 출력.;

proc sql;

  create table Mydata1(keep=q:) as

   select *

   from   BACK.Mydata;

   select * from Mydata1;

quit;

q1        q2        q3        q4

--------------------------------

 1         1         5         1

 2         1         4         1

 2         2         4         3

 3         1         .         3

 4         5         2         4

 5         4         5         5

 5         3         4         4

 4         5         5         5

 

 

맨 위로 이동 맨 위로 이동