2015-08-21 2 views
1

Мое намерение состоит в создании переменной на основе значений двух числовых. Я не написал никаких пользовательских функций в R и вам нужна помощь при запуске.Создать номинальную переменную из нескольких столбцов R

Dataset:

Мой набор данных имеет более 3k магазинов, но создал воспроизводимый пример первых 10 строк. Поставки в день недели показывают общий объем за этот день в течение года. Store_num представляет номер магазина и Total показывает общие поставки для магазина в течение года.

Я хочу, чтобы дни доставки были созданы в переменной под названием Del_Sch со следующими неравенствами. Если первое условие TRUE (50-100%), то создайте переменную с именем столбца. Если FALSE, проверьте второе условие и создайте переменную со всеми именами столбцов между 32-50% и т. Д. Если дней больше 20%, не учитываются преобладающие дни доставки.

-Возврат в день между 50-100% от общего количества.

-VOLUME в день между 32-50% от общего

-VOLUME в день между 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 

ответ

2

Используя tidyr и dplyr. Я сделал имена быть первым две буквы наклеены зафиксировать вторник/четверг путанице:

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 

Edit: есть несколько несоответствий между моими результатами и ваших данных (строка 5,6 и 9), в соответствии с ваши правила, у вас есть ошибки.

+0

Вы правы, я допустил ошибку в дни доставки. Кроме того, я получил ошибку, применяя эту функцию: Ошибка: не удалось найти функцию «%>%» –

+1

Вам нужно будет установить 'dplyr' и' tidyr': 'install.packages (" dplyr ")' 'install.packages ("tidyr") '. Труба '%>%' от magrittr, но должна поставляться с dplyr – jeremycg

+0

У меня не было установленных пакетов, а не функция. Я собираюсь отметить эту проблему как решение, но в моем наборе данных было наблюдение со всеми менее чем 20%, которые не получили ярлык. Я вручную обнаружил, что есть пробел. Как я могу обозначить его как «Нет», если все составляют <20% от общего числа? –

Смежные вопросы