16

私のデータは順序付けされた観測であり、操作を行っている間、順序付けを可能な限り維持したいと考えています。

この質問の答えを見て、データフレームで「A」の前に「B」を置きます。結果として得られるワイド データは、列「name」でソートされます。つまり、最初に「A」、次に「B」となります。

df = data.frame(name=c("B","B","A","A"),
                group=c("g1","g2","g1","g2"),
                V1=c(10,40,20,30),
                V2=c(6,3,1,7))

gather(df, Var, Val, V1:V2) %>% 
unite(VarG, Var, group) %>% 
spread(VarG, Val)

  name V1_g1 V1_g2 V2_g1 V2_g2
1    A    20    30     1     7
2    B    10    40     6     3

元の順序を維持する方法はありますか? このような:

  name V1_g1 V1_g2 V2_g1 V2_g2
1    B    10    40     6     3
2    A    20    30     1     7

04/02 編集:dplyr::summarise並べ替えも行われていることがわかりました。arrange(name, df$name)注文を復元するために引き続き機能します。でも、パッケージのデザインから余計な選別が必要なのかな?

df %>% 
  group_by(name) %>% 
  summarise(n()) %>% 

  name n()
1    A   2
2    B   2
4

3 に答える 3

10

順序は、因子レベルの順序から取得されます。

str(df)
'data.frame':   4 obs. of  4 variables:
 $ name : Factor w/ 2 levels "A","B": 2 2 1 1
 $ group: Factor w/ 2 levels "g1","g2": 1 2 1 2
 $ V1   : num  10 40 20 30
 $ V2   : num  6 3 1 7

レベルが「A」、「B」であることを確認します。

したがって、レベルの順序を表示されている順序に設定すると、機能します。

df = data.frame(name=c("B","B","A","A"),
                group=c("g1","g2","g1","g2"),
                V1=c(10,40,20,30),
                V2=c(6,3,1,7))

df %>% 
    mutate(name = factor(name,levels=unique(name))) %>% 
    mutate(group = factor(group,levels=unique(group))) %>% 
    gather(Var, Val, V1:V2) %>% 
    unite(VarG, Var, group) %>% 
    spread(VarG, Val)

結果:

  name V1_g1 V1_g2 V2_g1 V2_g2
1    B    10    40     6     3
2    A    20    30     1     7
于 2016-07-06T12:28:53.443 に答える