2016-07-05 2 views
2

Я создаю shiny app, в котором пользователь загрузит CSV-файл, содержащий несколько переменных. Используя dplyr, я буду select первыми четырьмя переменными, показанными ниже, и преобразуйте их из длинного формата.dplyr и tidyr: конвертировать длинный в широкий формат и упорядочивать столбцы

DATA

df <- read.table(text = c(" 
Customer Rate Factor Power 
W1 6 TK1 5 
W2 3 TK1 0 
W3 1 TK1 0 
W4 2 TK1 0 
W5 4 TK1 0 
W6 8 TK1 0 
W7 5 TK1 0 
W8 7 TK1 3 
W1 6 TK2 0 
W2 3 TK2 1 
W3 1 TK2 0 
W4 2 TK2 5 
W5 4 TK2 0 
W6 8 TK2 0 
W7 5 TK2 0 
W8 7 TK2 3 
W1 6 TK3 0 
W2 3 TK3 5 
W3 1 TK3 1 
W4 2 TK3 0 
W5 4 TK3 0 
W6 8 TK3 0 
W7 5 TK3 0 
W8 7 TK3 0 
W1 6 TK4 0 
W2 3 TK4 3 
W3 1 TK4 0 
W4 2 TK4 0 
W5 4 TK4 0 
W6 8 TK4 0 
W7 5 TK4 0 
W8 7 TK4 0 
W1 6 TK5 1 
W2 3 TK5 0 
W3 1 TK5 5 
W4 2 TK5 0 
W5 4 TK5 1 
W6 8 TK5 0 
W7 5 TK5 0 
W8 7 TK5 0 
W1 6 TK6 0 
W2 3 TK6 0 
W3 1 TK6 0 
W4 2 TK6 0 
W5 4 TK6 0 
W6 8 TK6 0 
W7 5 TK6 5 
W8 7 TK6 0 
W1 6 TK7 0 
W2 3 TK7 0 
W3 1 TK7 0 
W4 2 TK7 0 
W5 4 TK7 0 
W6 8 TK7 3 
W7 5 TK7 3 
W8 7 TK7 0 
W1 6 TK8 0 
W2 3 TK8 0 
W3 1 TK8 1 
W4 2 TK8 0 
W5 4 TK8 0 
W6 8 TK8 3 
W7 5 TK8 0 
W8 7 TK8 0 
W1 6 TK9 0 
W2 3 TK9 0 
W3 1 TK9 0 
W4 2 TK9 0 
W5 4 TK9 5 
W6 8 TK9 0 
W7 5 TK9 0 
W8 7 TK9 0 
W1 6 TK10 0 
W2 3 TK10 0 
W3 1 TK10 0 
W4 2 TK10 0 
W5 4 TK10 0 
W6 8 TK10 5 
W7 5 TK10 0 
W8 7 TK10 0 
W1 6 TK11 0 
W2 3 TK11 0 
W3 1 TK11 0 
W4 2 TK11 0 
W5 4 TK11 0 
W6 8 TK11 0 
W7 5 TK11 0 
W8 7 TK11 3 
W1 6 TK12 0 
W2 3 TK12 0 
W3 1 TK12 0 
W4 2 TK12 0 
W5 4 TK12 0 
W6 8 TK12 0 
W7 5 TK12 0 
W8 7 TK12 5"), header = T) 

Я использовал следующий код для преобразования долго широкоэкранного

долго WIDE

library(dplyr) 
library(tidyr) 
df_wide <- df %>% 
    tidyr::spread(Factor, Power) 

РЕЗУЛЬТАТ

> df_wide 
    Customer Rate TK1 TK10 TK11 TK12 TK2 TK3 TK4 TK5 TK6 TK7 TK8 TK9 
1  W1 6 5 0 0 0 0 0 0 1 0 0 0 0 
2  W2 3 0 0 0 0 1 5 3 0 0 0 0 0 
3  W3 1 0 0 0 0 0 1 0 5 0 0 1 0 
4  W4 2 0 0 0 0 5 0 0 0 0 0 0 0 
5  W5 4 0 0 0 0 0 0 0 1 0 0 0 5 
6  W6 8 0 5 0 0 0 0 0 0 0 3 3 0 
7  W7 5 0 0 0 0 0 0 0 0 5 3 0 0 
8  W8 7 3 0 3 5 3 0 0 0 0 0 0 0 

Широкий формат показывает уровни Factor переменной в TK1, а затем TK10

> levels(df$Factor) 
[1] "TK1" "TK10" "TK11" "TK12" "TK2" "TK3" "TK4" "TK5" "TK6" "TK7" "TK8" "TK9" 

Я хочу, чтобы уровни фактора быть от TK1, TK2 до TK12

я могу решить, как показано ниже

df$Factor <- factor(df$Factor, levels = c("TK1", "TK2" , "TK3" , "TK4", "TK5" , "TK6" , "TK7" , "TK8" , "TK9", "TK10", "TK11", "TK12")) 

Однако уровни переменной фактора будут функцией ввода пользователя. Это может быть 14, 15 или 20.

ВОПРОС

Есть ли способ, чтобы организовать уровни колонки Factor от низшего к высшему, независимо от пользовательского ввода?

ответ

2

Мы можем изменить его factor с levels указано

df %>% 
    mutate(Factor = factor(Factor, levels = paste0("TK", 1:12))) %>% 
    spread(Factor, Power) 

Или сделать его более динамичным, мы extract в нечисловое и цифровой части в отдельные столбцы («Factor1», «Factor2») , измените «Фактор» на factor с levels, указанным в paste, в последовательности min до max значениями в «Факторе 2» с величиной первого символа в «Факторе 1», удалите «Фактор 1» и «Фактор 2» и spread.

library(tidyr) 
res <- df %>% 
     extract(Factor, into = c("Factor1", "Factor2"), "(\\D+)(\\d+)", 
            remove = FALSE, convert=TRUE) %>% 
     mutate(Factor = factor(Factor, levels = paste0(Factor1[1], 
           min(Factor2):max(Factor2)))) %>% 
     select(-Factor1, -Factor2) %>% 
     spread(Factor, Power) 
head(res, 2) 
# Customer Rate TK1 TK2 TK3 TK4 TK5 TK6 TK7 TK8 TK9 TK10 TK11 TK12 
#1  W1 6 5 0 0 0 1 0 0 0 0 0 0 0 
#2  W2 3 0 1 5 3 0 0 0 0 0 0 0 0 
+0

Большое спасибо за ваше время и помощь. Что делать, если у другого пользователя 17 уровней вместо 12. Я хочу, чтобы код работал независимо от того, сколько уровней во вход пользователя – aelwan

+0

@aelwan Обновлено сообщение – akrun

+0

Спасибо Akrun. Я получил эту ошибку Ошибка в '.data.frame' (., Factor, into = c (" Factor1 "," Factor2 ")," (\\ D +) (\\ d +) ",: неиспользуемые аргументы (в = c («Factor1», «Factor2»), remove = FALSE, convert = TRUE) – aelwan

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

  • Нет связанных вопросов^_^