Примерно так:
df = data.frame(A=c(2,5,3), B=c(3,2,4))
add_column <- function(df, source_column, value_key){
modifiers <- df[value_key]
# Make names
value_key <- paste0("value", as.numeric(unlist(modifiers)))
# Make room
df[value_key] <- NA
column_i <- 1
for(column in value_key){
result <- df[source_column] * modifiers[column_i, 1]
# Modify here if you want multiplication or sum
df[column] <- result
column_i <- column_i + 1
}
return(df)
}
Что дает
> add_column(df, "A", "B")
A B value3 value2 value4
1 2 3 6 4 8
2 5 2 15 10 20
3 3 4 9 6 12
Контрольный показатель
Обратите внимание, хотя мой ответ сохраняет имена столбцов, он намного медленнеечем другой ответ опубликован.Смотри ниже.
library(microbenchmark)
mbm <- microbenchmark("add_column" = {add_column(df, "A", "B")},
"element_wise" = {element_wise_prod(df)})
mbm
> mbm
Unit: microseconds
expr min lq mean median uq max
add_column 1055.127 1071.859 1125.2072 1088.6105 1188.004 1311.104
element_wise 131.732 144.879 207.6434 159.3645 174.581 4813.909
neval
100
100