【发布时间】:2019-09-04 17:05:00
【问题描述】:
我在下面提到了 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。
存储桶<5、5-10 和>10 应始终存在于所需的输出中,无论该存储桶的值是否可用。
此外,如何通过括号() 中的存储桶获取特定ID 组的总和,用逗号分隔2 个十进制值。
括号中 sum 的字体应小于 count 的字体(即如果<5 bucket 的 count 字体为 12,则括号中 sum 的字体应为 10)。
此外,如果特定桶中的计数为 0,则不需要以 (0.00) 作为值的括号。
必需的 DF
Date Count <5 5-10 >10 sum
2018-01-01 3 1 (4) 1 (7) 1 (12) 23
A 1 1 (4) 0 0 4
B 1 0 1 (7) 0 7
C 1 0 0 1 (12) 12
2018-01-02 4 1 (4) 2 (16) 1 (15) 35
A 2 1 (4) 1 (6) 0 10
B 2 0 1 (10) 1 (15) 25
C 0 0 0 0 0
我正在使用的代码(来自 SO):
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
【问题讨论】:
标签: r dataframe dplyr data.table tidyr