Простое умножение матриц может сделать это легко.
df <- as.data.frame(as.matrix(df2) %*% as.matrix(df1))
Если вы хотите использовать dplyr
, вы можете сделать это.
library(dplyr)
df <- cbind(df2, df1) %>%
mutate_at(vars(-perc), ~ perc * .) %>%
select(-perc)
Если вы действительно хотите придерживаться"Tidyverse", вы можете использовать crossing
из tidyr
вместо cbind
. Это будет работать для нескольких строк в df1
.
library(tidyr)
library(tibble)
df2 %>%
rowid_to_column("group") %>%
crossing(df1) %>%
mutate_at(vars(-group, -perc), ~ perc * .) %>%
select(-perc)
В любом случае, вы можете переименовать результирующий фрейм данных, используя names()
.
names(df) <- 2010:2013
Позже Редактировать (Еще несколько опций):
Используется purrr
из тидиверса, и он может быть наиболее чистым для вас, если вы начнете с двух фреймов данных, как ваш пример.
library(purrr)
map_dfc(df1, ~ . * df2) %>%
set_names(2009 + seq_along(df1))
Выможет в основном выполнить то же самое в базе, но это вернет матрицу, а не фрейм данных, если мы не преобразуем его.
setNames(as.data.frame(sapply(df1, function(x) t(x * df2))), 2009 + seq_along(df1))