Làm nhiều hơn với future_map()

Lập trình song song trong R

Nabeel Imam

Data Scientist

Dữ liệu và bối cảnh

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

Tạo cột ký tự mới

twins <- function (x) {
    ifelse(x == 2,"Twins", "Not twins")
}
Lập trình song song trong R

Gán nhãn ca sinh đôi

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
...
Lập trình song song trong R

Gán nhãn ca sinh đôi

microbenchmark(
  "map_chr" = {
    data %>%
 mutate(label = map_chr(plurality, twins))
  },
  "future_map_chr" = {
    data %>%
 mutate(label = future_map_chr(plurality, twins))
  }
)
Đơn vị: giây
            expr     mean   median neval
1        map_chr 72.69067 73.50705    10
2 future_map_chr 34.52351 34.56357    10

Lưu đồ tạo cột "label" bằng map_chr() và future_map_chr(). future_map_chr() giúp giảm thời gian chạy 50%.

Lập trình song song trong R

Thao tác theo nhóm

Tỷ lệ sinh đôi

birth_prop <- function (df) {

  N <- sum(df$plurality == 2)  # Tổng số ca sinh đôi
  prop <- N/nrow(df)           # Tỷ lệ trên tổng số ca sinh
  names(prop) <- "proportion"  # Đặt tên cho giá trị

  return(prop) 
}
Lập trình song song trong R

Thao tác theo nhóm

Một dữ liệu có các nhóm A, B, C. Dữ liệu được tách theo nhóm, các giá trị được tổng hợp, rồi gộp lại thành dữ liệu với một hàng mỗi nhóm.

Lập trình song song trong R

Thao tác theo nhóm

plan(multisession, workers = 6)


data %>% # Tách theo bang, pipe sang future_map_dfr() split(data$state) %>%
# Chỉ truyền hàm tại đây future_map_dfr(birth_prop,
# Tên cột nhóm cho đối số .id .id = "state")
plan(sequential)

Kết quả được ghép hàng thành một data frame

   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
...
Lập trình song song trong R

Dùng biến toàn cục

# Đối số thứ hai để chỉ định giá trị plurality
birth_prop <- function (df, plur_value) {

  N <- sum(df$plurality == plur_value) # Tổng số ca sinh theo plurality cho trước
  prop <- N/nrow(df)                   
  names(prop) <- "proportion"          

  return(prop) 
}


new_plur <- 3 # Biến toàn cục một giá trị
Lập trình song song trong R

Dùng biến toàn cục

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
...
Lập trình song song trong R

Ghép cột vào data frame

data %>%
  split(data$state) %>% 
  future_map_dfc(birth_prop, # Biến thể _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 ...
Lập trình song song trong R

Ayo berlatih!

Lập trình song song trong R

Preparing Video For Download...