重塑数据 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 并像这样 Access
和 Date
对 Hour
求和
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
我尝试使用 gather
和 melt
,但它不起作用。你能建议我解决这个问题的方法吗?
我更改了我的解决方案,但现在应该可以了。我简单地剪切了两列 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
我有这样的数据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 并像这样 Access
和 Date
对 Hour
求和
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
我尝试使用 gather
和 melt
,但它不起作用。你能建议我解决这个问题的方法吗?
我更改了我的解决方案,但现在应该可以了。我简单地剪切了两列 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