如何将其他行绑定到数据框以获取列总数?

时间:2018-09-26 10:14:41

标签: r dplyr

我正尝试向列中的列总数添加数据行,以便在ggplot上显示时,可以在Shiny应用程序中为selectInput的“总计”过滤。但是,由于我具有各种数据类型(例如日期,字符串和数字),因此使其变得更加复杂。

这是样本df:

data.frame(
  Date = rep(seq(as.Date("2018-01-01"), by= "1 day", length.out= 3), 3),
  Company = c("A", "A", "A", "B", "B", "B", "C", "C", "C"),
  Attr_1 = c("AB", "AC", "AD", "AB", "AC", "AD", "AB", "AC", "AD"),
  Attr_2 = c(1,2,3,4,5,6,7,8,9)
)

这是我希望实现的目标:

Date       Company Attr_1 Attr_2
2018-01-01       A     AB      1
2018-01-02       A     AC      2
2018-01-03       A     AD      3
2018-01-01       B     AB      4
2018-01-02       B     AC      5
2018-01-03       B     AD      6
2018-01-01       C     AB      7
2018-01-02       C     AC      8
2018-01-03       C     AD      9
2018-01-01   Total     AB     12
2018-01-02   Total     AC     15
2018-01-03   Total     AD     18

有人对此有一个简单的解决方案吗?我能想到的是手动计算colSums,然后重新找到该数据框。但是,有没有更简单的解决方案?

4 个答案:

答案 0 :(得分:2)

AutoGeneratedRelay

您的编辑解决方案:

daemon

答案 1 :(得分:1)

即使有“ W”公司也可以使用的解决方案。

data.frame(
  Company = c("A", "B", "W", "D", "A", "B"),
  Attr_1 = c(12,13,14,14,3,5),
  Attr_2 = c(1,2,3,4,5,4),
  stringsAsFactors=FALSE
) -> df

df %>% summarise_if(is.numeric,sum) %>%
  mutate(Company='Total') %>% 
  bind_rows(df,.)
#  Company Attr_1 Attr_2
#1       A     12      1
#2       B     13      2
#3       W     14      3
#4       D     14      4
#5       A      3      5
#6       B      5      4
#7   Total     61     19

答案 2 :(得分:1)

这是基本的R解决方案:

df <- data.frame(
  Company = c("A", "B", "C", "D", "A", "B"),
  Attr_1 = c(12,13,14,14,3,5),
  Attr_2 = c(1,2,3,4,5,4)
)
rbind(df, data.frame(Company = "Total", Attr_1 = sum(df$Attr_1), Attr_2 = sum(df$Attr_2)))

输出:

  Company Attr_1 Attr_2
1       A     12      1
2       B     13      2
3       C     14      3
4       D     14      4
5       A      3      5
6       B      5      4
7   Total     61     19

答案 3 :(得分:0)

我发现adorn_totals软件包中的janitor对于此(和其他)任务非常有用

library( janitor )

df %>% adorn_totals()

# Company Attr_1 Attr_2
#       A     12      1
#       B     13      2
#       C     14      3
#       D     14      4
#       A      3      5
#       B      5      4
#   Total     61     19