汇总数据并显示下面的原始数据

时间:2017-09-11 14:01:25

标签: r list dplyr summarize

说我的数据看起来像这样

  vehicle <- c(1,2)
  no_of_visits <- c(3,2,4,3,1)
  duration <- c(20,30,18,15,20)
  bind <- cbind(vehicle, no_of_visits, duration)

 vehicle| no_of_visits | duration
  ----------------
   1 | 3 | 20
  ------------
   1 | 2 | 30
  ------------
   1 | 4 | 18
  -----------
   2 | 3 | 15
  -----------
   2 | 1 | 20
  -----------

而且,在这一行中我想显示汇总值,下面我想显示那些总结值

现在,它看起来应该是这样的

  vehicle|no_of_visits|duration
 ----------------------------
          1 | 9 | 68
          --------
          --------
          1 | 3 | 20
          --------
          1 | 2 | 30
          --------
          1 | 4 | 18
           -------
          2 | 4 | 35
           -------
           -------
          2 | 3 | 15
           -------
          2 | 1 | 2
           -------

如何让它发挥作用?

由于

2 个答案:

答案 0 :(得分:2)

您可以使用原始数据框summarize,然后bind_rows

bind_df <- as.data.frame(bind)

bind_df %>% 
    group_by(vehicle) %>% 
    summarise_all(sum) %>% 
    bind_rows(bind_df) %>% 
    arrange(vehicle)

# A tibble: 7 x 3
#  vehicle no_of_visits duration
#    <dbl>        <dbl>    <dbl>
#1       1            9       68
#2       1            3       20
#3       1            2       30
#4       1            4       18
#5       2            4       35
#6       2            3       15
#7       2            1       20

答案 1 :(得分:2)

使用dplyr

library(dplyr)

bind=data.frame(bind)
target=rbind(bind,bind%>%group_by(vehicle)%>%dplyr::summarise_all(sum)
target=target[order(target$vehicle,-target$no_of_visits),]

target
  vehicle no_of_visits duration
6       1            8       58
3       1            4       18
1       1            3       20
5       1            1       20
7       2            5       45
4       2            3       15
2       2            2       30

编辑:为您提供额外要求

vehicle <- c(1,2)
no_of_visits <- c(3,2,4,3,1)
duration <- c(20,30,18,15,20)
drivername <- c('a','b') 
bind <- cbind(vehicle, no_of_visits, duration,drivername)
bind=data.frame(bind,stringsAsFactors = F)
bind$vehicle=as.numeric(as.character(bind$vehicle))
bind$no_of_visits=as.numeric(as.character(bind$no_of_visits))
bind$duration=as.numeric(as.character(bind$duration))
bind$drivername=(as.character(bind$drivername))

第一选项:

target=rbind(bind,data.frame(bind%>%group_by(vehicle,drivername)%>%dplyr::summarise_all(sum)))

target[order(target$vehicle,-target$no_of_visits),]

  vehicle no_of_visits duration drivername
6       1            8       58          a
3       1            4       18          a
1       1            3       20          a
5       1            1       20          a
7       2            5       45          b
4       2            3       15          b
2       2            2       30          b

第二个选项

bind1=bind %>% 
    group_by(vehicle) %>% 
    summarise_each(funs(if(is.numeric(.)) sum(., na.rm = TRUE) else first(.)))

target=rbind(bind,bind1)
target[order(target$vehicle,-target$no_of_visits),]
  vehicle no_of_visits duration drivername
6       1            8       58          a
3       1            4       18          a
1       1            3       20          a
5       1            1       20          a
7       2            5       45          b
4       2            3       15          b
2       2            2       30          b