我在下面提到了R中的数据框。
ID Date Type Value
K-1 2018-01-01 A 4
K-2 2018-01-01 B 7
K-3 2018-01-01 C 12
K-4 2018-01-02 A 6
K-5 2018-01-02 A 4
K-6 2018-01-02 B 15
K-7 2018-01-02 B 10
我想学习如何在给定的所需数据帧以下转换数据帧,其中A
,B
和C
对于每个日期都应该是静态的,无论该特定类型是否为该日期是否可用。
此外,我想在ID
的存储桶中按日期和Type
计算<5
组(如果值在1-4之间),5-10
(如果值介于5到10之间)和>10
(如果值大于10)。
sum
列也应包含该特定日期和“类型”的总值。
Count
列应包含ID
组(按特定日期)和Type
的计数。
必需的DF
Date Count <5 5-10 >10 sum
2018-01-01 3 1 1 1 23
A 1 1 0 0 4
B 1 0 1 0 7
C 1 0 0 1 12
2018-01-02 4 1 2 1 35
A 2 1 1 0 10
B 2 0 1 1 25
C 0 0 0 0 0
我的代码:
Required_Output <- df1 %>%
group_by(Date, Type) %>%
dplyr::summarise(Count=n(),
A=sum(Type=='A'),
B=sum(Type=='B'),
C=sum(Type=='C')) %>%
ungroup() %>%
complete(Date, Type, fill=list(`Count`=0,A=0, B=0, C=0))
上面的代码没有给我想要的输出:(
答案 0 :(得分:0)
某些步骤可以进一步简化,但可以进行以下工作。
library(tidyverse)
dat2 <- dat %>%
mutate(Result = case_when(
Value < 5 ~"<5",
Value >= 5 & Value <= 10 ~"5-10",
Value > 10 ~">10"
)) %>%
group_by(Date, Type, Result) %>%
summarize(sum = sum(Value)) %>%
mutate(Flag = 1L) %>%
spread(Result, Flag, fill = 0L) %>%
group_by(Date, Type) %>%
summarize_all(list(~sum(.))) %>%
ungroup() %>%
complete(Date, Type)
dat2[is.na(dat2)] <- 0
dat3 <- dat2 %>% mutate(Count = rowSums(select(., -Date, -Type, -sum)))
dat4 <- dat3 %>%
group_by(Date) %>%
summarize_at(vars(-Type), list(~sum(.)))
dat_final <- map2_dfr(split(dat4, f = dat4$Date),
split(dat3, f = dat3$Date),
~bind_rows(.x %>% rename(Type = Date),
.y %>% select(-Date)))
dat_final2 <- dat_final %>%
select(Date = Type, Count, `<5`, `5-10`, `>10`, sum)
dat_final2
# # A tibble: 8 x 6
# Date Count `<5` `5-10` `>10` sum
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 2018-01-01 3 1 1 1 23
# 2 A 1 1 0 0 4
# 3 B 1 0 1 0 7
# 4 C 1 0 0 1 12
# 5 2018-01-02 4 1 2 1 35
# 6 A 2 1 1 0 10
# 7 B 2 0 1 1 25
# 8 C 0 0 0 0 0
数据
dat <- read.table(text = "ID Date Type Value
'K-1' '2018-01-01' A 4
'K-2' '2018-01-01' B 7
'K-3' '2018-01-01' C 12
'K-4' '2018-01-02' A 6
'K-5' '2018-01-02' A 4
'K-6' '2018-01-02' B 15
'K-7' '2018-01-02' B 10",
header = TRUE, stringsAsFactors = FALSE)