R의 병렬 프로그래밍
Nabeel Imam
Data Scientist
head(data)
state year month plurality
1 AK 1995 1 1
2 AK 1995 1 1
3 AK 1995 1 1
4 AK 1995 1 1
5 AK 1995 1 1
6 AK 1995 1 1
새 문자형 열 생성
twins <- function (x) {
ifelse(x == 2,"Twins", "Not twins")
}
plan(multisession, workers = 4)data %>% mutate(label = future_map_chr(plurality, twins))plan(sequential)
state year month plurality label
1 AK 1995 1 1 Not twins
2 AK 1995 1 1 Not twins
3 AK 1995 1 1 Not twins
4 AK 1995 1 1 Not twins
5 AK 1995 1 1 Not twins
6 AK 1995 1 1 Not twins
7 AK 1995 1 1 Not twins
8 AK 1995 1 1 Not twins
9 AK 1995 1 1 Not twins
10 AK 1995 1 1 Not twins
...
microbenchmark(
"map_chr" = {
data %>%
mutate(label = map_chr(plurality, twins))
},
"future_map_chr" = {
data %>%
mutate(label = future_map_chr(plurality, twins))
}
)
Unit: seconds
expr mean median neval
1 map_chr 72.69067 73.50705 10
2 future_map_chr 34.52351 34.56357 10

birth_prop <- function (df) {
N <- sum(df$plurality == 2) # 쌍둥이 출생 수
prop <- N/nrow(df) # 전체 출생 대비 비율
names(prop) <- "proportion" # 값 이름 지정
return(prop)
}

plan(multisession, workers = 6)data %>% # 연도별로 분할 후 future_map_dfr()에 파이프 split(data$state) %>%# 함수만 전달 future_map_dfr(birth_prop,# .id 인수에 그룹 열 이름 지정 .id = "state")plan(sequential)
결과를 한 데이터 프레임으로 행 결합
year proportion
1 AK 0.0114
2 AL 0.0264
3 AR 0.0196
4 AZ 0.0218
5 CA 0.0197
6 CO 0.0217
7 CT 0.0225
8 DC 0.0283
9 DE 0.0268
10 FL 0.0212
...
# 두 번째 인수로 plurality 값 지정 birth_prop <- function (df, plur_value) { N <- sum(df$plurality == plur_value) # 지정 다태아 출생 수 prop <- N/nrow(df) names(prop) <- "proportion" return(prop) }new_plur <- 3 # 전역 단일 값 변수
config <- furrr_options(globals = "new_plur")plan(multisession, workers = 4)data %>% split(data$state) %>% future_map_dfr(birth_prop, plur_value = new_plur, .options = config, .id = "state") plan(sequential)
state proportion
1 AK 0
2 AL 0.000659
3 AR 0
4 AZ 0.000605
5 CA 0.000673
6 CO 0.000776
7 CT 0.000867
8 DC 0.00189
9 DE 0
10 FL 0.00106
...
data %>%
split(data$state) %>%
future_map_dfc(birth_prop, # _dfc 변형
plur_value = new_plur,
.options = config)
AK AL AR AZ CA CO CT DC
1 0 0.000659 0 0.000605 0.000673 0.000776 0.000867 0.00189 ...
R의 병렬 프로그래밍