首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多列R创建标称变量

从多列R创建标称变量
EN

Stack Overflow用户
提问于 2015-08-21 19:11:59
回答 1查看 223关注 0票数 1

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

数据集:

我的dataset有超过3k的存储,但是创建了一个前10行的可复制示例。每周每天的送货量显示这一天到全年的总数量。Store_num表示商店号,Total显示全年商店的总交付量。

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

-Volume在一天内占总数的50-100% .

一天中-Volume占总数的32-50%

-Volume在一天内占总数的25-32% .

-Volume在一天内占总数的20-25% .

-Volume在一天内不到总量的20%。

可复制的例子:

代码语言:javascript
复制
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

期望输出:

代码语言:javascript
复制
   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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-21 19:45:02

使用tidyrdplyr。为了解决周二/周四的混乱,我把名字写成了前两个字母:

代码语言:javascript
复制
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行)之间有几处不匹配,根据你的规则,你在那里有错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32147774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档