tidyr::spread和dplyr::Summary中的隐式排序

tidyr::spread和dplyr::Summary中的隐式排序,r,dplyr,data-manipulation,tidyr,R,Dplyr,Data Manipulation,Tidyr,我的数据是有序的观测数据,我希望在进行操作时尽可能保持有序 以答案为例,我在数据框中将“B”放在“A”之前。生成的广域数据按列“name”排序,即先“A”,然后“B” 有没有办法保持原来的顺序?像这样: name V1_g1 V1_g2 V2_g1 V2_g2 1 B 10 40 6 3 2 A 20 30 1 7 04/02编辑:我刚刚发现dplyr::summary也进行排序排列(名称,df$name)仍然可以恢复订单

我的数据是有序的观测数据,我希望在进行操作时尽可能保持有序

以答案为例,我在数据框中将“B”放在“A”之前。生成的广域数据按列“name”排序,即先“A”,然后“B”

有没有办法保持原来的顺序?像这样:

  name V1_g1 V1_g2 V2_g1 V2_g2
1    B    10    40     6     3
2    A    20    30     1     7
04/02编辑:我刚刚发现
dplyr::summary
也进行排序<代码>排列(名称,df$name)仍然可以恢复订单。但我想知道,从包装的设计来看,额外的分类是否必要

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

  name n()
1    A   2
2    B   2

您可以根据原始数据框中的顺序按名称排序:

gather(df, Var, Val, V1:V2) %>% 
  unite(VarG, Var, group) %>% 
  spread(VarG, Val) %>%
  arrange( order(match(name, df$name)))

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

该顺序取自因子水平的顺序

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
tidyr::pivot\u wider()
,自tidyr 1.0.0以来推荐的对
tidyr::spread()
的替换,使行保持有序,以便您可以执行以下操作:

library(tidyr)
df=data.frame(name=c(“B”、“B”、“A”、“A”),
组=c(“g1”、“g2”、“g1”、“g2”),
V1=c(10,40,20,30),
V2=c(6,3,1,7))
枢轴(df,name_from=“group”,value_from=c(“V1”,“V2”))
#>#A tible:2 x 5
#>名称V1_g1 V1_g2 V2_g1 V2_g2
#>       
#>1 B 10 40 6 3
#>2 A 20 30 1 7

由(v0.3.0)于2019年9月14日创建。似乎在扩展步骤中,甚至“name”变量的因子级别也发生了变化……谢谢
arrange(match(name,df$name)
也可以。但是如何处理多个分组级别,比如“name”、“name1”、“name2”。对于我来说,
spread
默认包括排序是没有意义的。关于不需要排序,你是对的。至于级别,你可以在
arrange(a,b,c,…)中使用多个参数
并且可以根据您的喜好进行排序(也许我看不出问题所在)。但我理解您的痛苦,因为您已经对所有内容进行了排序…@bergant,对我来说,排序之外的更大问题是因子级别正在更改。@AnandaMahto我没有看到因子级别更改-在这两种情况下,级别都是“A”、“B”.但是排序确实发生了。从原始的2,2,1,1到结果中的1,2。我有tidyr版本0.2.0Hmm。你是对的。所以
arrange
会重构吗?对我来说这似乎是奇怪的行为。我从未意识到/欣赏unique()以相同的顺序返回-这对其他应用程序也很有用!
  name V1_g1 V1_g2 V2_g1 V2_g2
1    B    10    40     6     3
2    A    20    30     1     7