Stats & AI tech blog - '일단 시도함'
[R] R에서 변수 동적 처리 본문
이번 포스팅에서는 R for문 등에서 변수를 바꿔가며 동적으로 처리하는 방법에 대해 알아보고자 한다.
아래 모든 방법을 다 알 필요는 없고, 몇 가지만 알아둬도 유용하게 사용할 수 있다.
1. !!, !!!
`!!`와 `!!!`는 주로 `rlang` 패키지와 함께 사용되며, 비표준 평가(non-standard evaluation, NSE)에서 변수를 언바운딩하는 데 사용된다. `!!`는 단일 변수, `!!!`는 여러 변수를 언바운딩하는 데 사용된다.
* 비표준 평가(non-standard evaluation, NSE) : 함수의 인자에 표현식을 할당할 당시에는 평가(계산, 실행)을 수행하지 않고, 함수 내부의 원하는 곳에서 실행하도록 하는 것.
library(rlang)
var <- sym("x")
df <- data.frame(x = 1:10, y = 11:20)
# 동적으로 열 참조
df %>% mutate(new_col = !!var + 1)
# !!! 사용 예시
vars <- syms(c("x", "y"))
df %>% select(!!!vars)
2. {{}}
`{{}}`는 `dplyr` 패키지에서 비표준 평가를 위한 프레임워크인 tidyeval에서 사용된다.
library(dplyr)
# 동적 변수 사용 함수 예시
my_summarize <- function(data, var) {
data %>% summarize(mean_val = mean({{var}}, na.rm = TRUE))
}
df <- data.frame(x = rnorm(100), y = rnorm(100))
# 함수 호출 시 변수 이름을 동적으로 사용
my_summarize(df, x)
my_summarize(df, y)
3. df[[var]]
`df[[var]]`는 데이터 프레임에서 열을 참조하는 표준 방법이다. `for`문이나 함수 내부에서 변수 이름을 문자열로 사용할 때 유용한 방법이다.
df <- data.frame(x = 1:10, y = 11:20)
vars <- c("x", "y")
# for문에서 df[[var]] 사용 예시
for (var in vars) {
print(mean(df[[var]]))
}
4. `get` 함수
`get` 함수는 변수 이름을 문자열로 받아 해당 변수를 참조할 수 있게 해준다.
# 데이터 생성
df <- data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10))
vars <- c("a", "b", "c")
# for문에서 get 함수 사용 예시
for (var in vars) {
print(paste("Mean of", var, ":", mean(get(var, df), na.rm = TRUE)))
}
5. `eval`과 `parse` 함수
`eval`과 `parse` 함수를 사용하여 문자열을 코드로 실행한다.
# 데이터 생성
df <- data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10))
vars <- c("a", "b", "c")
# for문에서 eval과 parse 사용 예시
for (var in vars) {
expr <- parse(text = paste0("mean(df$", var, ", na.rm = TRUE)"))
print(paste("Mean of", var, ":", eval(expr)))
}
6. `do.call` 함수
`do.call` 함수는 함수 호출을 리스트로 전달할 수 있게 해준다.
# 데이터 생성
df <- data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10))
vars <- c("a", "b", "c")
# for문에서 do.call 사용 예시
for (var in vars) {
mean_val <- do.call("mean", list(df[[var]], na.rm = TRUE))
print(paste("Mean of", var, ":", mean_val))
}
7. `purrr` 패키지의 `map` 함수
`purrr` 패키지의 `map` 함수는 객체 .x에 대해 특정 함수 .f를 적용해서 결과를 리스트로 출력하여 반복 작업을 보다 간결하게 작성할 수 있다. map_dbl(), map_chr(), map_df() 등을 사용할 경우 결과를 리스트가 아닌 숫자형 벡터, 문자형 벡터, 데이터프레임 등 다른 형태로 받을 수 있다.
library(purrr)
# 데이터 생성
df <- data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10))
vars <- c("a", "b", "c")
# map 함수 사용 예시
means <- map_dbl(vars, ~ mean(df[[.x]], na.rm = TRUE))
names(means) <- vars
print(means)
8. `base` R의 `lapply` 함수
`lapply` 함수는 리스트를 입력받아 반복 작업을 수행한다.
# 데이터 생성
df <- data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10))
vars <- c("a", "b", "c")
# lapply 함수 사용 예시
means <- lapply(vars, function(var) mean(df[[var]], na.rm = TRUE))
names(means) <- vars
print(means)
'Programming > R' 카테고리의 다른 글
[R] IPTW, Inverse Probability of Treatment Weighting (역확률가중치) (2) | 2024.11.09 |
---|---|
[R] Loop function for Univariable Logistic Regression (0) | 2024.11.08 |
[R] R에서 라이브러리 (패키지) 만들기 (0) | 2024.07.09 |
[R] Caret Package로 모델 학습 및 튜닝하기 (0) | 2024.05.29 |
[R] EDA with ggplot2 (0) | 2024.02.27 |