Отфильтруйте из фрейма данных и создайте другой фрейм данных, используя r - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть два фрейма данных следующим образом:

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)) 

Я хочу создать строку с именем total_car, которая будет являться продуктом car и mazda.Однако, если df_whole не имеет строки car, я все же хотел бы создать строку total_car, которая будет mazda*0. Вывод, который я хочу получить, будет таким, как показано ниже.Как я мог рассчитать что-то вроде этого в R

df_car <- data.frame(month = c("mazda", "yamaha","total"),
                 april = c(11,12,1.1),
                 may = c(14,15,7))

1 Ответ

0 голосов
/ 18 сентября 2018

Похоже, что 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()), и я преобразовал ваши данные в длинный формат, который в любом случае, вероятно, будет лучшей структурой для вашей базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...