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

3. 결측값 할당을 위한 조건 변환


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

 


1. SAS

MAIN

data mydata;

 set BACK.mydata;

     * 관측값 5를 결측치로 전환.;

     if q1=5 then q1=.;

     if q2=5 then q2=.;

     if q3=5 then q3=.;

     if q4=5 then q4=.;

run;

proc print;run;

 

data mydata;

 set BACK.mydata;

     * 배열을 사용하여서 한번에 결측치로 변환.;

     array q q1-q4;

     do over q;

        if q=5 then q=.;

     end;

run;

proc print;run;

OBS    id    workshop    gender    q1    q2    q3    q4

 1      1        1         f        1     1     .     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     .     2     4

 6      6        2         m        .     4     .     .

 7      7        1         m        .     3     4     4

 8      8        2         m        4     .     .     .

 


2. SPSS

MAIN

 

* SPSS Program to Assign Missing Values.

GET FILE=("c:\mydata.sav")

MISSING q1 TO q4 (9).

SAVE OUTFILE=("c:\mydata.sav")

 


3. R-PROJECT

MAIN

* 결측치 값 할당을 위한 R-Project 프로그램.

# NAR-Project에서 결측값 코드이다.

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

mydata

attach(mydata)

 

# 직접 데이터 수정. 데이터 에디터 화면에서 데이터 수정.

fix(mydata)

 

# 변수 q1이 5인 값에 대하여 세번째 변수(q1)의 값을 결측치로 변경.

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

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

mydata[q1==5,3] <- NA

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 NA  4  5  5

7        1      m NA  3  4  4

8        2      m  4  5  5  5

 

 # 변수 q1이 5인 값에 대하여, 변수명이 q1인 변수의 값을 결측치로 변경.

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

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

 mydata[q1==5,"q1"] <- NA

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 NA  4  5  5

7        1      m NA  3  4  4

8        2      m  4  5  5  5

 

# ifelse 함수를 사용하여서 q1의 값이 5인 관측치를 결측치로 변경.

mydata$q1 <- ifelse( q1 == 5, NA, mydata$q1)

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 NA  4  5  5

7        1      m NA  3  4  4

8        2      m  4  5  5  5

 

# mydata에서 모든 변수에 대하여 모든 값 5를 관측치로 변경.

mydata[mydata==5] <- NA

print(mydata)

workshop gender q1 q2 q3 q4

1        1      f  1  1 NA  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 NA  2  4

6        2      m NA  4 NA NA

7        1      m NA  3  4  4

8        2      m  4 NA NA NA

 

#---------------------------------------------

# 한번에 많은 변수를 변경하는 예제.

#---------------------------------------------

# 5의 값을 관측치로 변경하는 함수 생성.

My5isNA <- function(x) {x[x==5] <- NA; x}

 

# 단일 변수에 대하여 함수를 적용.

mydata$q1 <- My5isNA(q1)

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 NA  4  5  5

7        1      m NA  3  4  4

8        2      m  4  5  5  5

 

# 변수 리스트에 대하여 결측치 값을 할당.

# Lapply 함수는 리스트의 모든 값에 대하여 함수를 적용한다.(Data Frame은 리스트의 형태.)

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

  My5isNA)

print(mydata)

  workshop gender q1 q2 q3 q4

1        1      f  1  1 NA  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 NA  2  4

6        2      m NA  4 NA NA

7        1      m NA  3  4  4

8        2      m  4 NA NA NA

 

# 변수명 지정없이 연속적인 변수를 적용.

# 변수명 대신에 열 번호를 사용.

# q1은 3번째 변수이고, q4는 6번째 변수 이므로, 3:6을 사용.

mydata[ 3:6 ] <- lapply( mydata[ 3:6 ], My5isNA)

mydata

  workshop gender q1 q2 q3 q4

1        1      f  1  1 NA  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 NA  2  4

6        2      m NA  4 NA NA

7        1      m NA  3  4  4

8        2      m  4 NA NA NA

 

# 열 번호에 의한 것 보다 변수명에 의해 많은 연속적인 변수를 다루는 방법.

# Which함수는 각 변수명의 열 번호를 발견.

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

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

mydata[ A:Z ] <- lapply( mydata[ A:Z ], My5isNA)

mydata

  workshop gender q1 q2 q3 q4

1        1      f  1  1 NA  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 NA  2  4

6        2      m NA  4 NA NA

7        1      m NA  3  4  4

8        2      m  4 NA NA NA

 

# 관측값 대체

# 변수 q3에서 관측치를 제외한 관측값의 평균을 q3의 관측값중 결측치를 대체한다.

mydata[is.na(mydata$q3),"q3"] <- mean(mydata$q3,na.rm=TRUE)

 workshop gender q1 q2       q3 q4
1       1      f  1  1  5.000000 1
2       2      f  2  1  4.000000 1
3       1      f  2  2  4.000000 3
4       2      f  3  1  4.142857 3
5       1      m  4  5  2.000000 4
6       2      m  5  4  5.000000 5
7       1      m  5  3  4.000000 4
8       2      m  4  5  5.000000 5

 

 


4. S-PLUS

MAIN

 

mydata<-read.table ("c:/data/mydata.csv",header=TRUE,
sep=",",row.names="id")

print(mydata)

# 직접 데이터 수정. 데이터 에디터 화면에서 데이터 수정.

fix(mydata)

# 변수 q1이 5인 값에 대하여 세번째 변수(q1)의 값을 결측치로 변경.

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

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

mydata[q1==5,3] <- NA

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 NA  4  5  5

7        1      m NA  3  4  4

8        2      m  4  5  5  5

 

 # 변수 q1이 5인 값에 대하여, 변수명이 q1인 변수의 값을 결측치로 변경.

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

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

mydata[q1==5,"q1"] <- NA

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 NA  4  5  5

7        1      m NA  3  4  4

8        2      m  4  5  5  5

 

# ifelse 함수를 사용하여서 q1의 값이 5인 관측치를 결측치로 변경.

mydata$q1 <- ifelse( q1 == 5, NA, mydata$q1)

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 NA  4  5  5

7        1      m NA  3  4  4

8        2      m  4  5  5  5

 

# mydata에서 모든 변수에 대하여 모든 값 5를 관측치로 변경.

mydata[mydata==5] <- NA

print(mydata)

  workshop gender q1 q2 q3 q4

1        1      f  1  1 NA  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 NA  2  4

6        2      m NA  4 NA NA

7        1      m NA  3  4  4

8        2      m  4 NA NA NA

 

#---------------------------------------------

# 한번에 많은 변수를 변경하는 예제.

#---------------------------------------------

# 5의 값을 관측치로 변경하는 함수 생성.

My5isNA <- function(x) {x[x==5] <- NA; x}

 

# 단일 변수에 대하여 함수를 적용.

mydata$q1 <- My5isNA(q1)

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 NA  4  5  5

7        1      m NA  3  4  4

8        2      m  4  5  5  5

 

# 변수 리스트에 대하여 결측치 값을 할당.

# Lapply 함수는 리스트의 모든 값에 대하여 함수를 적용한다.(Data Frame은 리스트의 형태.)

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

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

  My5isNA)

print(mydata)

  workshop gender q1 q2 q3 q4

1        1      f  1  1 NA  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 NA  2  4

6        2      m NA  4 NA NA

7        1      m NA  3  4  4

8        2      m  4 NA NA NA

 

# 변수명 지정없이 연속적인 변수를 적용.

# 변수명 대신에 열 번호를 사용.

# q1은 3번째 변수이고, q4는 6번째 변수 이므로, 3:6을 사용.

mydata[ 3:6 ] <- lapply( mydata[ 3:6 ], My5isNA)

mydata

  workshop gender q1 q2 q3 q4

1        1      f  1  1 NA  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 NA  2  4

6        2      m NA  4 NA NA

7        1      m NA  3  4  4

8        2      m  4 NA NA NA

 

# 열 번호에 의한 것 보다 변수명에 의해 많은 연속적인 변수를 다루는 방법.

# Which함수는 각 변수명의 열 번호를 발견.

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

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

mydata[ A:Z ] <- lapply( mydata[ A:Z ], My5isNA)

mydata

  workshop gender q1 q2 q3 q4

1        1      f  1  1 NA  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 NA  2  4

6        2      m NA  4 NA NA

7        1      m NA  3  4  4

8        2      m  4 NA NA NA

 


5. PROC SQL

 

proc sql;

  select id,

         workshop,

         gender,

         case when q1=5 then .

         else q1 end "q1",

         case when q2=5 then .

         else q2 end "q2",

         case when q3=5 then .

         else q3 end "q3",

         case when q4=5 then .

         else q4 end "q4"

  from   BACK.mydata;

quit;

id  workshop  gender          q1        q2        q3        q4

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

 1         1  f                1         1         .         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         .         2         4

 6         2  m                .         4         .         .

 7         1  m                .         3         4         4

 8         2  m                4         .         .         .

 

proc sql;

  select id,

         workshop,

         gender,

         ifn(q1=5,.,q1)"q1",

         ifn(q2=5,.,q2)"q2",

         ifn(q3=5,.,q3)"q3",

         ifn(q4=5,.,q4)"q4"

  from   BACK.mydata;

quit;

id  workshop  gender          q1        q2        q3        q4

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

 1         1  f                1         1         .         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         .         2         4

 6         2  m                .         4         .         .

 7         1  m                .         3         4         4

 8         2  m                4         .         .         .