데이터 변환 in R - deiteo byeonhwan in R

데이터 프레임을 처리한 결과를 리스트로 얻은 뒤 해당 리스트를 다시 데이터 프레임으로 변환할 필요가 있을 수 있다. 이 변환은 몇 단계를 거쳐서 처리해야 한다.

1. unlist( )를 통해 리스트를 벡터로 변환한다.

2. matrix( )를 사용해 벡터를 행렬로 변환한다.

3. as.data.frame( )3을 사용해 행렬을 데이터 프레임으로 변환한다.

4. names( )를 사용해 리스트로부터 변수명을 얻어와 데이터 프레임의 각 컬럼에 이름을 부여한다.

다음은 아이리스 데이터의 각 컬럼에 대한 평균을 lapply( )로 구한 뒤 이 결과를 다시 데이터 프레임으로 변환한 예다.

> d <- as.data.frame(matrix(unlist(lapply(iris[, 1:4], mean)),
+                           ncol=4, byrow=TRUE))
> names(d) <- names(iris[, 1:4])
> d
  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width
1     5.843333     3.057333         3.758     1.199333

또는 do.call( )을 사용해 변환할 수도 있다. 지금 살펴보는 예제의 경우에는 lapply( )가 반환한 리스트 내의 각 컬럼별 계산 결과가 들어 있다. 따라서 이를 새로운 데이터 프레임의 컬럼들로 합치기 위해 cbind( )를 사용한다. 다음 코드는 do.call( )을 사용해 lapply( )의 결과로 나온 리스트 내 요소 각각을 cbind( )의 인자들로 넘겨준다.

> data.frame(do.call(cbind, lapply(iris[, 1:4], mean)))
  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width
1     5.843333     3.057333         3.758     1.199333

앞에서 살펴본 두 가지 방법 중 unlist( )후 matrix( )를 거쳐 데이터 프레임으로 변환하는 방법에는 한 가지 문제가 있다. unlist( )는 벡터를 반환하는데, 벡터에는 한 가지 데이터 타입만 저장할 수 있기 때문에 변환 과정에서 하나의 데이터 타입으로 데이터가 모두 형 변환되어버리기 때문이다.

다음 예에서는 문자열과 숫자가 혼합된 경우 unlist( )가 문자열을 모두 엉뚱한 값으로 바꿔버리는 것을 볼 수 있다.

> x <- list(data.frame(name="foo", value=1),
+           data.frame(name="bar", value=2))
> unlist(x)
 name value name value
    1     1    1     2

따라서 데이터 타입이 혼합된 경우에는 do.call( )을 사용해야 한다. 다음 예에서는 리스트의 각 요소가 한 행에 해당하므로 rbind를 호출했다.

> x <- list(data.frame(name="foo", value=1),
+           data.frame(name="bar", value=2))
> do.call(rbind, x)
  name value
1  foo     1
2  bar     2

이것만으로 끝이라면 좋겠지만 아쉽게도 do.call(rbind, …) 방식은 속도가 느리다는 단점이 있다. 따라서 대량의 데이터를 변환해야 한다면 ‘5장. 데이터 조작 II’에서 설명할 rbindlist( )를 사용해야 한다.


3 이와 유사한 함수로 주어진 객체를 벡터로 변환하는 as.vector( ), 리스트로 변환하는 as.list( ), 팩터로 변환하는 as.factor( ) 등의 함수가 있다.

신간 소식 구독하기

뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.

R의 형 변환은 암시적으로 발생할 수 있고, 때에 따라 형 변환이 전혀 예상치 않은 곳에서 일어난다. 예를 들어, 데이터 프레임 d에 2개 컬럼이 있고 각 컬럼의 데이터 타입이 numeric(숫자를 저장한 벡터)이라고 가정하자. 이때 d[, 1]은 첫 번째 컬럼의 데이터를 데이터 프레임이 아닌 numeric(즉, 벡터)으로 반환한다. d에 대한 연산의 결과가 데이터 프레임이 아니라 numeric이라는 점은 사용자를 당황하게 할 수 있는 점이며, 이러한 변환을 피하고 싶다면 drop=FALSE를 지정해야 한다. 또는 파일에서 문자열을 불러들였을 때 data.frame( )으로 데이터 프레임을 생성하면서 stringsAsFactor=FALSE를 지정하지 않으면 문자열이 character(문자열 벡터)가 아니라 팩터가 된다.

이와 같은 암시적 형 변환에 대비하기 위해 모든 의심스러운 함수 호출 뒤에는 ‘2.9 타입 판별’ 절에서 설명한 str( ), class( )를 사용해 현재 사용하는 데이터가 올바른 데이터 타입인지 계속 확인할 필요가 있다.

반면 타입을 강제로 변환하고자 할 때도 있을 것이다. 문자열 벡터를 팩터로 변환하는 경우 등이 그 예다. 이러한 변환을 하는 한 가지 방법은 타입 이름이 ‘typename’이라 할 때 ‘as.typename( )’이라는 함수를 사용하는 것이다. 다음에 관련 함수의 목록을 보였다.

표 2-24 데이터 타입 변환 함수

함수

의미

as.factor(x)

주어진 객체 x를 팩터로 변환

as.numeric(x)

주어진 객체 x를 숫자를 저장한 벡터로 변환

as.character(x)

주어진 객체 x를 문자열을 저장한 벡터로 변환

as.matrix(x)

주어진 객체 x를 행렬로 변환

as.array(x)

주어진 객체 x를 배열로 변환

as.data.frame(x)

주어진 객체 x를 데이터 프레임으로 변환

또 다른 타입 변환 방법은 factor( ), data.frame( ) 등과 같이 데이터를 생성하는 함수에 다른 타입의 데이터를 인자로 넘겨주는 것이다. 이 경우 필요에 따라 형 변환이 수행된다.

신간 소식 구독하기

뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.

D-과학 이야기

데이터 변환 in R - deiteo byeonhwan in R
R 프로그래밍 데이터변환 변수생성 within transform

* 파생변수란, 기존의 변수를 더하거나 빼는 등 다양한 조건이나 함수를 활용하여 생성한 변수

1. transform 함수

 - 데이터프레임에 새로운 변수 추가

 - transform(데이터프레임명, 파생변수=생성식, 파생변수2=생성식2, ... )

   * 단, transform 함수만을 실행한다면, 기존 데이터프레임이 변경되지 않는다.

     기존 데이터 프레임에 파생변수를 추가하고자 한다면, newiris <- transform() 새 데이터 프레임을 지정해야함

 - (예) newiris <- transform(iris, new=add+etc)

데이터 변환 in R - deiteo byeonhwan in R
transform 함수/ 파생변수/ R 프로그래밍

2. 데이터프레임명$변수명

 - $을 이용하면 데이터프레임의 변수를 명명할 수 있다.

 - 데이터프레임명$변수명 <- 추가하고자 하는 데이터 벡터

 - (예) iris$add<-1:150

데이터 변환 in R - deiteo byeonhwan in R
R 프로그래밍 데이터프레임 변수 생성 $

3. 데이터프레임["변수명"]

 - 데이터프레임[""]을 이용하여 데이터프레임의 변수를 명명할 수 있다.

 - 데이터프레임["변수명"] <- 추가하고자 하는 데이터 벡터

 - (예) iris["etc"]<-151:300

데이터 변환 in R - deiteo byeonhwan in R
데이터프레임 변수 생성, 추가 R 프로그래밍

- (예) iris["number"]<-ifelse(iris$add%%2==0,"짝수","홀수")

데이터 변환 in R - deiteo byeonhwan in R
데이터프레임 변수 생성, 추가(함수) R 프로그래밍

4. within

 - 데이터프레임 또는 리스트 수정

 - within(데이터, 표현식)

 - (예) 

 ① 데이터프레임 만들기

name <-c("a","b","c","d","e")

age <-c(24,27,30,32,17)

df <-data.frame(name, age)

데이터 변환 in R - deiteo byeonhwan in R
R 프로그래밍 데이터프레임 만들기

 ② within 함수로 새 변수 생성

df<- within(df, {
            type=character(0)   # 생략가능
            type[age<20] = "10대"
            type[age>=20 & age<30] = "20대"
            type[age>=30 & age<40] = "30대"
            type = factor(type, level = c("10대","20대","30대"))

             })

데이터 변환 in R - deiteo byeonhwan in R
 데이터 과학 R 프로그래밍 within 함수로 새로운 변수생성

▼ R 프로그래밍 제어문 반복문 while, for, repeat 함수 / 데이터 과학

[R] 제어문 2. 반복문 while, for, repeat 함수

1. while  - 반복 횟수 지정 없이 주어진 조건이 만족하는동안 계속해서 반복을 수행  - 변수 초기값 설정/ while(조건문) {실행문} * 단, 실행문은 주어진 조건문이 참일 경우에만 실행된다.  - (예) y

datasciencee.tistory.com

데이터 변환 in R - deiteo byeonhwan in R

▼ R 프로그래밍 제어문 조건문 if else 함수 

[R] 제어문 1. 조건문 if/else 와 ifelse 함수

1. if/else  - 조건식을 기준으로 조건이 참/거짓일 때 처리 방식을 다르게 하려는 경우  - if(조건문) {실행문 또는 함수} / else if(조건문) {실행문 또는 함수} / else {실행문 또는 함수} * else if 와 els..

datasciencee.tistory.com

데이터 변환 in R - deiteo byeonhwan in R