Суммирование выбранных строк в новую строку в R - PullRequest
0 голосов
/ 29 августа 2018

Я должен добавить новую строку total в кадре данных, где я пытаюсь добавить значения для этой строки, значение которой равно Mazda. Ниже указан df, который я использую.

df <- data.frame(month = c("mazda 3", "mazda cx5", "mazda 6","mazda miata","honda civic","honda accord"),
             april = c(.1,.2,.3,.3,.4,.5),
             may = c(.3,.4,.5,.2,.1,.5),
             june = c(.2,.1,.5,.1,.2,.3))


d2<- df %>% mutate(total == (rowsum(df[-1], df[rownames(month) %like% "Mazda"])))

Вывод должен быть:

df_out <- data.frame(month = c("mazda 3", "mazda cx5", "mazda 6","mazda miata","honda civic","honda accord","total_mazda"),
                 april = c(.1,.2,.3,.3,.4,.5,.8),
                 may = c(.3,.4,.5,.2,.1,.5,1.4),
                 june = c(.2,.1,.5,.1,.2,.3,.9))

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Попробуйте использовать apply(df, 2, ...) для циклического перебора столбцов с маской grepl для мазды в первом столбце.

Я использовал некоторую хитрость bind_(rows|cols), чтобы получить фрейм данных в правильном формате.

library(dplyr)

df <- data_frame(month = c("mazda 3", "mazda cx5", "mazda 6","mazda miata","honda civic","honda accord"),
             april = c(.1,.2,.3,.3,.4,.5),
             may = c(.3,.4,.5,.2,.1,.5),
             june = c(.2,.1,.5,.1,.2,.3))

df_out <- bind_rows(
  df %>% as_data_frame(),
  data_frame(month = "total_mazda") %>%
    bind_cols(
      apply(df[, 2:ncol(df)],
        2,
        function(x, y = grepl(".*(m|M)azda.*", df[[1]])) sum(x[y])
      ) %>%
        as.list() %>%
        as_data_frame()))
0 голосов
/ 29 августа 2018

Мы можем получить sum числовых столбцов в summarise_at при поднаборе значений на основе подстроки 'mazda' в 'month', создать столбец 'month' и связать с исходным набором данных

library(tidyverse)
df %>% 
  summarise_at(2:4, funs(sum(.[str_detect(month, 'mazda')]))) %>% 
  mutate(month = 'Total') %>% 
  bind_rows(df, .)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...