dplyr和tidyr:将长格式转换为宽格式并排列

时间:2016-07-05 02:56:43

标签: r tidyr r-factor

我正在创建一个shiny app,用户将在其中上传包含多个变量的.csv文件。使用dplyr,我将select前四个变量,如下所示,并将它们从长格式转换。

数据

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) 

我使用下面的代码从长格式转换为宽格式

长篇大论

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

RESULT

> 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.

问题

有什么方法可以将因子列的级别从最低到最高排列,而不管用户的输入是什么?

1 个答案:

答案 0 :(得分:2)

我们可以将其更改为factor,并指定levels

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

或者让它更具动态性,我们将非数字和数字部分extract分成不同的列('Factor1','Factor2'),将{Factor'更改为factor {{1}由levels'Factor2'中的pastemin值的序列指定为'Factor1'中的第一个字符值,删除'Factor1'和'Factor2'和max

spread