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

闪亮的

我正在创建一个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)

结果

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

问题

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

阿克伦

我们可以将其更改为factorlevels指定

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

或使其更有活力,我们extract的非数字和数字部分为单独列(“因子1”,“因子2”),改变“因素”,以factorlevels由指定的paste荷兰国际集团的序列min,以max在“因子2”值与的“ Factor1”中的第一个字符值,然后删除“ Factor1”和“ Factor2”,并删除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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将长格式转换为宽格式

来自分类Dev

将长格式转换为宽格式

来自分类Dev

将长格式转换为宽

来自分类Dev

将分类数据从长格式转换为宽格式

来自分类Dev

如何使用小时值和日期时间索引将宽格式转换为长格式?

来自分类Dev

如何将DataFrame从长格式转换为宽格式,按计数汇总列的值

来自分类Dev

将长格式数据帧转换为宽格式但保留 R 中的列数

来自分类Dev

将R转换为宽格式,并根据列中的值进行排列

来自分类Dev

在SQL Server和DataFrame中将宽格式转换为长格式具有大约1000列-优化

来自分类Dev

将大型的宽格式数据(1982列)融为长格式,然后有效地将其转换为R中的宽格式

来自分类Dev

将数据集从“宽”格式转换为“长”格式,并将时间列转换为时间格式以进行时间序列分析

来自分类常见问题

在数据框中从长格式转换为宽格式

来自分类Dev

在R中将数据帧从“宽”格式转换为“长”格式

来自分类Dev

R如何从长格式转换为宽格式

来自分类Dev

无法在R中从长格式准确转换为宽格式

来自分类Dev

在数据框中从长格式转换为宽格式

来自分类Dev

在SQL中将表格从长格式转换为宽格式

来自分类Dev

使用R中的两个因素将长格式转换为宽格式

来自分类Dev

如何在SQL中使用数字值将长格式转换为宽格式

来自分类Dev

使用python将宽格式csv转换为长格式csv

来自分类Dev

将缺少条目的Pandas df从长格式转换为宽格式

来自分类Dev

根据列中的值将R转换为宽格式

来自分类Dev

使用melt()将宽数据转换为需要值查找的长数据格式

来自分类Dev

将具有互不排斥类别的长数据转换为宽格式

来自分类Dev

使用melt()将宽数据转换为需要值查找的长数据格式

来自分类Dev

我将宽数据帧转换为长格式的 R 代码有什么问题?

来自分类Dev

将长格式整形为宽格式,每个长格式的观察值有两列

来自分类Dev

将经/长转换为正确的格式

来自分类Dev

当ID变量在列标题中编码时,将数据从宽格式转换为长格式

Related 相关文章

  1. 1

    将长格式转换为宽格式

  2. 2

    将长格式转换为宽格式

  3. 3

    将长格式转换为宽

  4. 4

    将分类数据从长格式转换为宽格式

  5. 5

    如何使用小时值和日期时间索引将宽格式转换为长格式?

  6. 6

    如何将DataFrame从长格式转换为宽格式,按计数汇总列的值

  7. 7

    将长格式数据帧转换为宽格式但保留 R 中的列数

  8. 8

    将R转换为宽格式,并根据列中的值进行排列

  9. 9

    在SQL Server和DataFrame中将宽格式转换为长格式具有大约1000列-优化

  10. 10

    将大型的宽格式数据(1982列)融为长格式,然后有效地将其转换为R中的宽格式

  11. 11

    将数据集从“宽”格式转换为“长”格式,并将时间列转换为时间格式以进行时间序列分析

  12. 12

    在数据框中从长格式转换为宽格式

  13. 13

    在R中将数据帧从“宽”格式转换为“长”格式

  14. 14

    R如何从长格式转换为宽格式

  15. 15

    无法在R中从长格式准确转换为宽格式

  16. 16

    在数据框中从长格式转换为宽格式

  17. 17

    在SQL中将表格从长格式转换为宽格式

  18. 18

    使用R中的两个因素将长格式转换为宽格式

  19. 19

    如何在SQL中使用数字值将长格式转换为宽格式

  20. 20

    使用python将宽格式csv转换为长格式csv

  21. 21

    将缺少条目的Pandas df从长格式转换为宽格式

  22. 22

    根据列中的值将R转换为宽格式

  23. 23

    使用melt()将宽数据转换为需要值查找的长数据格式

  24. 24

    将具有互不排斥类别的长数据转换为宽格式

  25. 25

    使用melt()将宽数据转换为需要值查找的长数据格式

  26. 26

    我将宽数据帧转换为长格式的 R 代码有什么问题?

  27. 27

    将长格式整形为宽格式,每个长格式的观察值有两列

  28. 28

    将经/长转换为正确的格式

  29. 29

    当ID变量在列标题中编码时,将数据从宽格式转换为长格式

热门标签

归档