【问题标题】:Create nominal variable from multiple columns R从多列 R 创建名义变量
【发布时间】:2015-11-15 20:07:35
【问题描述】:

我的意图是根据两个数字的值创建一个变量。我没有在 R 中编写任何用户定义的函数,需要帮助入门。

数据集:

我的数据集有超过 3k 个商店,但创建了前 10 行的可重现示例。一周中每天的交付量显示全年当天的总交易量。 Store_num 表示商店编号,Total 显示商店全年的总交付量。

我希望在名为 Del_Sch 的变量中创建主要的交货天数,并具有以下不等式。如果第一个条件为 TRUE (50-100%),则使用列名创建变量。如果为 FALSE,则测试第二个条件并创建所有列名在 32-50% 之间的变量,等等。如果没有超过 20% 的天数,则不计算主要交货天数。

-一天的成交量在总量的 50-100% 之间。

-一天的交易量占总量的 32-50%

-一天的交易量占总量的 25-32%。

-一天的交易量占总量的 20-25%。

-一天的交易量不到总量的 20%。

可重现的示例:

Store_Num <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
#Total deliveries made per week
Sun_Del <- c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)
Mon_Del <- c(10, 50, 51, 7, 80, 97, 21, 49, 30, 3)
Tue_Del <- c(7, NA, 2, 50, 5, 56, 1, 4, 35, 52)
Wed_Del <- c(49, 51, 1, 4, 51, 16, 2, 2, 1, 1)
Thu_Del <- c(3, 2, 47, 7, 40, 2, 6, 5, 1, 7)
Fri_Del <- c(50, 49, 3, 51, 53, 86, 9, 52, 25, 52)
Sat_Del <- c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)
Total <- c(119, 152, 104, 119, 229, 257, 39, 112, 92, 115)
#Single dataset
Schedule <- data.frame(Store_Num, Sun_Del, Mon_Del, Tue_Del,
                       Wed_Del, Thu_Del, Fri_Del, Sat_Del, Total)

Schedule
   Store_Num Sun_Del Mon_Del Tue_Del Wed_Del Thu_Del Fri_Del Sat_Del Total
1          1      NA      10       7      49       3      50      NA   119
2          2      NA      50      NA      51       2      49      NA   152
3          3      NA      51       2       1      47       3      NA   104
4          4      NA       7      50       4       7      51      NA   119
5          5      NA      80       5      51      40      53      NA   229
6          6      NA      97      56      16       2      86      NA   257
7          7      NA      21       1       2       6       9      NA    39
8          8      NA      49       4       2       5      52      NA   112
9          9      NA      30      35       1       1      25      NA    92
10        10      NA       3      52       1       7      52      NA   115

所需的输出:

   Store_Num Sun_Del Mon_Del Tue_Del Wed_Del Thu_Del Fri_Del Sat_Del Total Del_Sch
1          1      NA      10       7      49       3      50      NA   119     WF
2          2      NA      50      NA      51       2      49      NA   152     MWF
3          3      NA      51       2       1      47       3      NA   104     MTh
4          4      NA       7      50       4       7      51      NA   119     TF
5          5      NA      80       5      51      40      53      NA   229     MWF
6          6      NA      97      56      16       2      86      NA   257     MTF
7          7      NA      21       1       2       6       9      NA    39     M
8          8      NA      49       4       2       5      52      NA   112     MF
9          9      NA      30      35       1       1      25      NA    92     MTF
10        10      NA       3      52       1       7      52      NA   115     TF

【问题讨论】:

    标签: r


    【解决方案1】:

    使用tidyrdplyr。我将名称设置为粘贴的前两个字母以解决周二/周四的混乱:

    library(dplyr)
    library(tidyr)
    Schedule %>% gather(Day, del, -Store_Num, -Total) %>%
                 mutate(proportion = ifelse(del/Total >= 0.5, 1,
                                     ifelse(del/Total >= 0.32, 2,
                                     ifelse(del/Total >= 0.25, 3,
                                     ifelse(del/Total >= 0.20, 4,
                                     NA))))) %>%
                 group_by(Store_Num) %>%
                 summarise(days = paste0(substr(Day[which(
                                             proportion == min(proportion, na.rm = TRUE))],
                                               1, 2), collapse = "")) %>%
                 merge(Schedule, ., by = "Store_Num")
    
       Store_Num Sun_Del Mon_Del Tue_Del Wed_Del Thu_Del Fri_Del Sat_Del Total   days
    1          1      NA      10       7      49       3      50      NA   119   WeFr
    2          2      NA      50      NA      51       2      49      NA   152 MoWeFr
    3          3      NA      51       2       1      47       3      NA   104   MoTh
    4          4      NA       7      50       4       7      51      NA   119   TuFr
    5          5      NA      80       5      51      40      53      NA   229     Mo
    6          6      NA      97      56      16       2      86      NA   257   MoFr
    7          7      NA      21       1       2       6       9      NA    39     Mo
    8          8      NA      49       4       2       5      52      NA   112   MoFr
    9          9      NA      30      35       1       1      25      NA    92   MoTu
    10        10      NA       3      52       1       7      52      NA   115   TuFr
    

    编辑:我的结果与您的数据(第 5,6 和 9 行)之间存在一些不匹配,根据您的规则,您有错误。

    【讨论】:

    • 你说得对,我在交货日期上弄错了。另外,我在应用函数时遇到错误:错误:找不到函数“%>%”
    • 您必须安装 dplyrtidyr : install.packages("dplyr") install.packages("tidyr")。管道%&gt;% 来自 magrittr,但应该与 dplyr 一起提供
    • 我没有安装软件包,功能无法正常工作。我将把这个问题标记为已解决,但在我的数据集中有一个观察结果,所有少于 20% 的人没有得到标签。我手动发现有一个空白。当全部都
    • 在通话结束时添加%&gt;% mutate(days, which(days==""), None)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2014-09-02
    • 2014-09-29
    • 2020-09-29
    • 2016-12-29
    • 1970-01-01
    • 2019-09-11
    相关资源
    最近更新 更多