Stats & AI tech blog - '일단 시도함'

[R] R에서 변수 동적 처리 본문

Programming/R

[R] R에서 변수 동적 처리

justdoit ok? 2024. 7. 12. 15:13

이번 포스팅에서는 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)