重塑数据 table 从水平到垂直并在 R 中求和

Reshape data table from horizon to vertical and sum in R

我有这样的数据table:

df<-data.frame("Date"=c("2010-05-27","2010-05-27","2010-07-08","2010-07-09","2010-07-09"),"Access1"=c(5,5,NA,7,7),"Access2"=c(6,6,NA,7,7),"Hour1"=c(0.55,0.55,NA,0.01,0.01),"Hour2"=c(0.55,0.55,NA,0.01,0.01))
    Date       Access1 Access2 Hour1 Hour2
1 2010-05-27       5       6  0.55  0.55
2 2010-05-27       5       6  0.55  0.55
3 2010-07-08      NA      NA    NA    NA
4 2010-07-09       7       7  0.01  0.01
5 2010-07-09       7       7  0.01  0.01

我想将它重塑为垂直 table 并像这样 AccessDateHour 求和

     Date    Access Hour
1 2010-05-27      5 1.10
2 2010-05-27      6 1.10
3 2010-07-08     NA   NA
4 2010-07-09      7 0.04

我尝试使用 gathermelt,但它不起作用。你能建议我解决这个问题的方法吗?

我更改了我的解决方案,但现在应该可以了。我简单地剪切了两列 Access2 和 Hour2 并将它们作为附加行放在求和之前。

library(dplyr)

df %>%
  select(Date, Access = Access1, Hour = Hour1) %>%
  rbind(df %>% select(Date, Access = Access2, Hour = Hour2)) %>%
  group_by(Date,Access) %>%
  summarise(Hour = sum(Hour))
library(reshape2) ; library(dplyr) 
dat <- melt(df, id= c("Date", "Hour1", "Hour2")) %>% #melt "Accesses" only
     mutate(sumHour = Hour1 + Hour2) %>% #sum "Hours"
     distinct() %>% 
     group_by(Date, value) %>% 
     summarise(Hour = sum(sumHour)) %>% 
     rename(Access = value) %>%  #rename for wanted output
     arrange(Date)  #order by date

这应该会给你想要的输出。

你可以试试 tidyverse

library(tidyverse)
df %>% 
  rownames_to_column() %>% 
  gather(k, v, -Date, -rowname) %>% 
  separate(k, into = c("type", "num"), sep = "(?<=[A-Za-z])(?=[0-9])") %>% 
  spread(type, v) %>% 
  group_by(Date, Access) %>% 
  summarise(Hour = sum(Hour))
# A tibble: 4 x 3
# Groups:   Date [3]
  Date       Access  Hour
  <fct>       <dbl> <dbl>
1 2010-05-27      5  1.1 
2 2010-05-27      6  1.1 
3 2010-07-08     NA NA   
4 2010-07-09      7  0.04