Добавить строку в кадр данных с помощью dplyr

У меня есть данные этого образца:

cvar <- c("2015-11-01","2015-11-02","All")
nvar1 <- c(12,10,5)
nvar2 <- c(7,5,6)
data <- cbind.data.frame(cvar,nvar1,nvar2)

И я просто хочу добавить новую строку в data.frame, содержащий суммы nvar1 и nvar2 и символ, поэтому с базой R я бы просто использовал

data[nrow(data)+1,] <- c("add",sum(data[,2]),sum(data[,3]))

или что-то более умное с лапкой, но просто чтобы показать вам, что я ищу.

Мне нужна эта простая команда в среде pipe, поэтому data% > %... дает мне результат выше.

Оцените любую помощь, спасибо.

Ответы

Ответ 1

Что-то вроде этого, может быть:

data %>% 
     rbind(c("add",sum(nvar1),sum(nvar2)))
#        cvar nvar1 nvar2
#1 2015-11-01    12     7
#2 2015-11-02    10     5
#3        All     5     6
#4        add    27    18

Edit:

Согласно вашему комментарию, это будет работать:

data %>% 
  mutate(nvar3 = nvar1) %>% 
  rbind(c("add",sum(nvar1),sum(nvar2),sum(.$nvar3))) 

Использование . позволит rbind найти nvar3

Edit2:

Предоставьте новую строку в виде списка и сохраните классы столбцов:

> str(
+ data %>% 
+   mutate(nvar3 = nvar1) %>% 
+   rbind(list("add",sum(nvar1),sum(nvar2),sum(.$nvar3))) 
+ )
'data.frame':   4 obs. of  4 variables:
 $ cvar : chr  "2015-11-01" "2015-11-02" "All" "add"
 $ nvar1: num  12 10 5 27
 $ nvar2: num  7 5 6 18
 $ nvar3: num  12 10 5 27

Ответ 3

Используя только dplyr, вы можете сделать следующее

data %<>%
  summarise(cvar = "add",
            nvar1 = sum(nvar1),
            nvar2 = sum(nvar2)) %>%
  bind_rows(data)

что приводит к

        cvar nvar1 nvar2
1        add    27    18
2 2015-11-01    12     7
3 2015-11-02    10     5
4        All     5     6

Обратите внимание, что таким образом новая строка добавляется в начале, а не в конец исходного фрейма.

Если вы хотите добавить новую строку в конец вместо, используйте следующий код (благодаря krlmlr для указания этого варианта)

data %<>%
  summarise(cvar = "add",
            nvar1 = sum(nvar1),
            nvar2 = sum(nvar2)) %>%
  bind_rows(data, .)

что приводит к

        cvar nvar1 nvar2
1 2015-11-01    12     7
2 2015-11-02    10     5
3        All     5     6
4        add    27    18

Ответ 4

Очень простой пример с использованием bind_rows:

myvalues<-data.frame(MyValue=c(123),MyOtherValue=c(456))
myvalues %>% 
  bind_rows(data_frame(MyValue=c(789),MyOtherValue=c(101112)))