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
...
# 第二个参数指定多胎数值 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 并行编程