如何在ivot_wider中指定特定的列顺序

时间:2020-02-29 07:04:38

标签: r dplyr

数据帧indrur由指示传输方式的变量S447.1组成。我使用dplyr对变量进行分组并将其转换为宽格式。

library(dplyr)      
    indrurmodes<-indrur %>% 
          group_by(V024,V025,V190) %>%count(S447.1) %>% 
          pivot_wider(names_from = S447.1,values_from = n, values_fill = list(n = 0))

它给了我以下输出。但是我想要按特定顺序排列的列-GovtAmb,OthAmb,Jeep,Tempo,Scooter,Bus,Cart,Foot,NA。我必须对多个过滤的数据帧执行以上代码。每次,我都会得到不同的订单。这使得在使用列索引作为参考的情况下很难执行进一步的算术运算。如何保持所需的列顺序?

       V024     V025    V190 GovtAmb Jeep   Tempo Foot  NA     OthAmb Scooter  Bus  Cart
3   Andaman     Rural   Middle  67   21     16     16   615     2     3        4      0
4   Andaman     Rural   Richer  66   39     20     3    617     2     1        0      0
5   Andaman     Rural   Richest 21   18     5      2    278     0     2        5      1
6   Andhra      Rural   Poorest 25   0      35     4    294     5     0        6      0

1 个答案:

答案 0 :(得分:2)

您有两个选择。

library(dplyr)
library(tidyr)

#Order of the columns you want
vec <- c("GovtAmb","OthAmb","Jeep","Tempo","Scooter","Bus","Cart","Foot",NA)

1)使用pivot_wider

pivot_wider以它们出现的顺序返回该列。因此,您可以在使用arrange之前按所需顺序pivot_wider数据。

indrur %>% 
   group_by(V024,V025,V190) %>%
   count(S447.1) %>% 
   arrange(match(S447.1, vec)) %>%
   pivot_wider(names_from = S447.1,values_from = n, values_fill = list(n = 0))

2)使用较旧的spread,它根据因子级别给出列顺序。

indrur %>% 
  group_by(V024,V025,V190) %>%
  count(S447.1) %>% 
  mutate(S447.1 = factor(S447.1, levels = vec)) %>%
  spread(S447.1,n,fill = 0)