Похоже, что SQL-запрос будет лучше работать для объединения ваших таблиц и получения сводных данных.
Вот решение tidyverse
(обратите внимание на inner_join()
, то есть sql):
library(dplyr)
library(tidyr)
df <- data_frame(month = c("mazda", "yamaha"),
april = c(11,12),
may = c(14,15))
df_whole <- data_frame(month = c("car", "bikes"),
april = c(.1,.2),
may = c(.5,.2))
# adds car row if missing - there is probably a better way to handle the missing data
if (!"car" %in% df_whole$month) df_whole <- bind_rows(df_whole, data_frame(month = "car"))
# converts NAs to 0
df_whole[is.na(df_whole)] <- 0
# convert to long format
df_long <- df %>%
rename("brand" = "month") %>%
gather(key = "month", value = "val", april:may)
df_whole_long <- df_whole %>%
rename("type" = "month") %>%
gather(key = "month", value = "val", april:may)
# calcualte the multiplication
dat <- inner_join(df_long, df_whole_long, by = "month") %>% # combine dfs
filter(brand == "mazda", type == "car") %>% # filter out key rows
mutate(total = val.x * val.y) # do multiplication and add into new column
# reformat and append
df_car <- bind_rows(df,
bind_cols(data_frame(month = "total"),
dat %>%
select(month, total) %>%
spread(month, total)))
df_car:
month april may
1 mazda 11.0 14
2 yamaha 12.0 15
3 total 1.1 7
Я использовал tidyverse
фреймы данных (data_frame()
, а не data.frame()
), поэтому строки не были преобразованы в факторы (того же можно добиться, добавив stringsAsFactors = F
к data.frame()
), и я преобразовал ваши данные в длинный формат, который в любом случае, вероятно, будет лучшей структурой для вашей базы данных.