Решение с использованием базы R, которая позволяет избежать многократного ввода команды mutate
.Предполагая, что ваш фрейм данных называется dat
с 40 столбцами как 20 из них с началом S
, а другой 20
как P
.dat2
- это окончательный результат.
# Select the columns from S01 to S20
dat_S <- dat[, sprintf("S%02d", 1:20)]
# Select the columns from P01 to P20
dat_P <- dat[, sprintf("P%02d", 1:20)]
# Calculate the new columns
dat_SP <- dat_S/dat_P
# Rename the columns
names(dat_SP) <- paste(sprintf("S%02d", 1:20), sprintf("P%02d", 1:20), sep = "_")
# Combine dat_SP to the original data frame
dat2 <- cbind(dat, dat_SP)
Если вы действительно работаете над data.table
, мы все равно можем использовать ту же стратегию.Обратите внимание, что способ выбора столбца по именам отличается от обычного фрейма данных.
library(data.table)
# Convert to data.table
setDT(dat)
# Select the columns from S01 to S20
S_cols <- sprintf("S%02d", 1:20)
dat_S <- dat[, ..S_cols]
# Select the columns from P01 to P20
P_cols <- sprintf("P%02d", 1:20)
dat_P <- dat[, ..P_cols]
# Calculate the new columns
dat_SP <- dat_S/dat_P
# Rename the columns
names(dat_SP) <- paste(sprintf("S%02d", 1:20), sprintf("P%02d", 1:20), sep = "_")
# Combine dat_SP to the original data frame
dat2 <- cbind(dat, dat_SP)
ДАННЫЕ
set.seed(4749)
dat <- as.data.frame(matrix(runif(120), ncol = 40))
names(dat) <- c(sprintf("S%02d", 1:20), sprintf("P%02d", 1:20))