dplyr
các hàm hoạt động trên data.table
s, vì vậy đây là một dplyr
giải pháp cũng "tránh vòng lặp for" :)
dt %>% mutate(across(all_of(cols), ~ -1 * .))
Tôi benchmarked nó sử dụng mã Orhan của (thêm hàng và cột) và bạn sẽ thấy dplyr::mutate
với across
chủ yếu là thực hiện nhanh hơn so với hầu hết các giải pháp khác và chậm hơn so với các giải pháp sử dụng data.table lapply.
library(data.table); library(dplyr)
dt <- data.table(a = 1:100000, b = 1:100000, d = 1:100000) %>%
mutate(a2 = a, a3 = a, a4 = a, a5 = a, a6 = a)
cols <- c("a", "b", "a2", "a3", "a4", "a5", "a6")
dt %>% mutate(across(all_of(cols), ~ -1 * .))
library(microbenchmark)
mbm = microbenchmark(
base_with_forloop = for (col in 1:length(cols)) {
dt[ , eval(parse(text = paste0(cols[col], ":=-1*", cols[col])))]
},
franks_soln1_w_lapply = dt[ , (cols) := lapply(.SD, "*", -1), .SDcols = cols],
franks_soln2_w_forloop = for (j in cols) set(dt, j = j, value = -dt[[j]]),
orhans_soln_w_forloop = for (j in cols) dt[,(j):= -1 * dt[, ..j]],
orhans_soln2 = dt[,(cols):= - dt[,..cols]],
dplyr_soln = (dt %>% mutate(across(all_of(cols), ~ -1 * .))),
times=1000
)
library(ggplot2)
ggplot(mbm) +
geom_violin(aes(x = expr, y = time)) +
coord_flip()
Được tạo vào 2020-10-16 bởi gói reprex (v0.3.0)
set
với afor-loop
. Tôi nghi ngờ nó sẽ nhanh hơn.