如何使用R中的多个条件在数据透视中组织数据

问题描述 投票:1回答:1

我有以下提到的数据框:

DF:

ID      Date                 Status     Remark       Flag        Value     reps_rt
P-1     20/03/2020  19:08:09 SA         1            L           10000     RI
P-1     20/03/2020  19:08:09 SA         1            L           10000     KT
P-1     20/03/2020  19:08:09 SA         1            L           10000     JS
P-2     20/03/2020  20:08:09 SA         2            K           15000
P-3     20/03/2020  21:08:09 SA         2            J           20000     PO
P-4     20/03/2020  20:08:09 SA         2            H           20000     MK
P-4     20/03/2020  20:08:09 SA         2            H           20000     SS
P-4     20/03/2020  20:08:09 SA         2            H           20000     SA
P-5     20/03/2020  17:08:09 RE                      G           8000
P-6     20/03/2020  12:08:09 RE         1                        6000      RF
P-7     20/03/2020  11:08:09 XA         1                        13000
P-8     19/03/2020  19:08:09 SA         1            L           15000     LO
P-9     19/03/2020  11:08:09 SA                      K           10000     JJ
P-10    19/03/2020  10:08:09 SA         2            J           10000     NO

我想使用DF获得以下输出,其中Status列具有不同的3个值,Remarks也具有不同的3个值1、2或[null],Flag列具有不同的6个值与[null]。对于一个不同的ID,我们在reps_rt列中有多个条目。

我需要通过基于Value创建3组(如0-15000、15000-50000,来创建以下数据框。

  • 如果对于唯一标识,Flag的值为0或[null] / NA,但reps_rt的值为0或[null] / NA,则值为a
  • 如果对于唯一标识,resp_rt的值不是0或[null] / NA,但是Flag的值是0或[null] / NA,那么它将是b
  • 如果对于唯一ID,Flagresp_rt都具有非0或[Null] / NA的值,那么它将是c
  • 如果对于一个唯一的ID,Flagresp_rt都为0或[Null] / NA,则为d

20/03/2020 0 - 15000 15000 - 50000 Status count percent L K J H G [Null] count percent L K J H G [Null] Total SA 2 2/5 1 1 0 0 0 1 2 0 0 1 1 0 0 4 a 1 1/2 0 1 0 0 0 0 0 0 0 0 0 0 0 1 b 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 c 1 1/2 1 0 0 0 0 0 2 0 0 1 1 0 0 3 d 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 RE 2 2/5 0 0 0 0 1 1 0 0 0 0 0 0 0 2 a 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 b 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 c 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 XA 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 a 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 b 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 c 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 Total 5 1 1 0 0 1 3 2 0 0 1 1 0 0 7

我已经提到了基于最新日期为20/03/2020的必需输出,如果数据框没有按照startdate的最新日期,则将所有值0保留在输出数据框中。百分比列仅供参考,将计算百分比值。

r dataframe dplyr tidyverse
1个回答
0
投票

您的输出格式看起来更像是Excel数据透视表或报表表,而不是R数据框用于分析。特别是小计的行和列。但是,R与用于产生具有小计行的数据透视表或报表的工具相比,具有更多用于处理整齐的矩形数据的工具。因此,最好选择其他工具(例如Excel),它更自然地产生您要查找的输出结构。

如果您确定要在R中执行此操作,那么简单的起点将是mutateifelsesummarise,如下所示:


df %>% mutate(L = ifelse(Flag == "L",1,0),
              K = ifelse(Flag == "K",1,0),
              # etc for Flag) %>%
  mutate(sub_status = NA) %>%
  mutate(sub_status = ifelse(!is.na(Flag) & reps_rt == 0, "a", sub_status),
         sub_status = ifelse(is.na(Flag) & reps_rt != 0, "b", sub_status),
         # etc for sub-status) %>%
  mutate(value_class = ifelse(0 <= Value & Value <= 15000, "0-15000", "15000-50000")) %>%
  group_by(Date, status, sub_status, value_class) %>%
  summarise(L = sum(L),
            K = sum(K),
            # etc
            count = n())

然后您将不得不过滤到感兴趣的日期,并重新排列周围的值以匹配所需的格式。

© www.soinside.com 2019 - 2024. All rights reserved.