R assign함수를 이용하여 반복적으로 값을 변수에 넣기
1. assign 함수
일반적으로 R에서 변수에 값을 할당할 때 화살표(<-)나 = 표시를 이용합니다.
추가적으로 assign 함수를 이용해서도 값을 할당할 수 있습니다.
# 지정된 변수명에 값이 할당됨 # 변수명은 반드시 문자형으로!! assign(변수명, 값) # x1이라는 변수명에 벡터 c(1,2,3,4,5)를 할당함 assign("x1", c(1,2,3,4,5)) x1 # 실행 1 2 3 4 5 |
2. 반복문으로 응용하기
변수를 할당할 때 할당연산자인 화살표(<-) 또는 = 를 사용하면 간단한데
굳이 assign 함수를 써야하는 이유가 있을까요?
우리가 생성할 변수가 몇개 안되면 굳이 assign 함수를 사용할 필요가 없겠죠
그런데 변수를 엄청 많이 생성해야 한다면? assign 함수가 필요합니다!
변수명이 data1, data2, ..., data100 을 동시에 생성하고 싶다면 반복문을 사용해서 변수를 생성합니다. 그런데 할당연산자 화살표(<-)를 이용하면 변수명이 바뀌지 않습니다!
예를 들면 다음과 같습니다.
for( x in 1:100){ paste0('data',1:100) <- x } Error in paste0("data", 1:100) <- x : 대입의 대상이 비언어적 객체로 확장됩니다 |
위 코드에서는 data1, data2, ..., data100에 1부터 100까지의 수를 할당하는 코드입니다.
paste0 함수를 이용해서 'data1' 부터 'data100'까지의 문자형 벡터를 생성합니다.
그런데 이 코드는 빨간색 에러메시지가 나타납니다..
즉, 화살표를 받는 쪽(할당될 변수)에는 함수를 이용할 수 없습니다 ㅠㅠ
하지만 우리는 assign 함수로 매우 효율적으로 코드를 구성할 수 있습니다~!
for( x in 1:100){ assign(paste0('data',1:100)[x], x) } |
위 코드를 입력하고 확인해보면 data1 에는 1, data2 에는 2, .. ,data100에는 100이 할당되어 있는 것을 확인할 수 있습니다.
코드가 이해가 안된다면 차근차근 속에 있는 부분들부터 보면됩니다.
(1) paste0는 문자를 합치는 함수입니다. 즉 paste0('xx',1) 을 실행하면 xx1 이라는 문자가 생성됩니다.
(2) 변수명 생성하기: paste0('data',1:100) 을 통해 data1부터 data100까지 100개 요소를 가지는 문자 벡터를 생성합니다.
(3) 반복문 이용: x에 1부터 100까지의 데이터를 할당됩니다.
(4) 각 문자에 값 넣기: paste0('data',1:100)[x] 는 (2)번 단계에서 생성된 문자형 벡터의 첫번째 요소에 위치한 'data1'를 가져오고 두번째 요소에 있는 'data2'를 가져옵니다. for 반복문이 한번씩 돌때마다 변수명이 자동으로 바뀌면서 'data100'까지 값을 할당합니다.
아래 예제를 다시 봅시다.
# var라는 변수명에 one, two three four five 를 요소로 가지는 문자 벡터 생성 var <- c('one','two','three','four','five') # var 변수에 각 1,2,3,4,5를 할당 for( x in 1:length(var)){ assign(var[x], x) } one 1 two 2 three 3 four 4 five 5 |
위 내용처럼 반복문과 함께 assign 함수를 이용하면 반복적인 작업을 간단하게 해결할 수 있습니다.
변수명을 문자형 벡터로 구성해야 한다는 것만 유의해주면 효율적으로 사용할 수 있을 겁니다.
궁금한 점은 댓글로 달아주세요~
'데이터 분석 > R 데이터 처리 & 분석' 카테고리의 다른 글
[R] 작업 디렉토리에서 파일 찾기 및 변수 할당하기 (0) | 2021.11.04 |
---|---|
[R] get 함수로 문자를 변수로 인식시키기 (0) | 2021.06.07 |
[R] 엑셀 파일 불러오기와 저장하기 (xls, xlsx) (3) | 2020.12.25 |
[R] 반복문 사용하기 (for, while, break, next) (0) | 2020.10.27 |
[R] 벡터 생성과 인덱싱(Indexing) 및 추출 (0) | 2020.10.06 |