В base R
мы можем использовать transform
transform(sam_dat, t1_t2 = t1 + t2,
t1_t3 = t1 + t2 + t3, t1_t4 = t1 + t2 + t3 + t4)
# Operator t1 t2 t3 t4 t1_t2 t1_t3 t1_t4
#1 1 5.728534 4.976992 8.696908 1.079436 10.705526 19.40243 20.48187
#2 2 2.655087 7.176185 9.347052 7.829328 9.831272 19.17832 27.00765
#3 3 2.016819 7.698414 1.255551 4.068302 9.715234 10.97078 15.03909
. Или другой вариант - установить набор данных в list
, а затем использовать rowSums
* 1010. *
Или сделать его более компактным с индексированием
nm1 <- paste(names(sam_dat)[2], names(sam_dat)[3:5], sep="_")
sam_dat[nm1] <- sapply(3:5, function(i) rowSums(sam_dat[2:i]))
Или другой вариант rowCumsums
из matrixStats
library(matrixStats)
sam_dat[nm1] <- rowCumsums(as.matrix(sam_dat[-1]))[,-1]
Или base R
операция, аналогичная accumulate
с purrr
, является Reduce
sam_dat[nm1] <- do.call(cbind, Reduce(`+`, sam_dat[-1], accumulate = TRUE)[-1])
или с mutate
с dplyr
library(dplyr)
sam_dat %>%
mutate(t1_t2 = t1 + t2,
t1_t3 = t1 + t2 + t3,
t1_t4 = t1 + t2 + t3 + t4)
Или другой вариант в tidyverse
- повернуть в «длинный» формат, выполнить вычисления и затем преобразовать обратно в «широкий»
library(tidyr)
library(stringr)
sam_dat %>%
pivot_longer(cols = -Operator) %>%
group_by(Operator) %>%
mutate(value = cumsum(value)) %>%
slice(-1) %>%
ungroup %>%
mutate(name = str_c('t1_', name)) %>%
pivot_wider(names_from = name, values_from = value) %>%
select(-Operator) %>%
bind_cols(sam_dat, .)
# A tibble: 3 x 8
# Operator t1 t2 t3 t4 t1_t2 t1_t3 t1_t4
# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 5.73 4.98 8.70 1.08 10.7 19.4 20.5
#2 2 2.66 7.18 9.35 7.83 9.83 19.2 27.0
#3 3 2.02 7.70 1.26 4.07 9.72 11.0 15.0