r - tidyr::spread 和 dplyr::summarise 中的隐式排序

标签 r dplyr data-manipulation tidyr

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

回答 this question ,我在数据框中将“B”放在“A”之前。生成的宽数据按列“名称”排序,即首先是“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

最佳答案

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

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

关于r - tidyr::spread 和 dplyr::summarise 中的隐式排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29381069/

相关文章:

r - 在 Shiny 中按日期过滤

r - 在Tidyverse中的多个变量“with mutate_at”中重新编码相同因子水平的值

r - 为现有列值创建新顺序而不重新排序数据框中的行 - R

python - 在 Polars Python API 中将两列组合成元组

r - 在 r 中拆分分组二项式数据

删除 R 中整个数据帧列上的随机字符串的一部分

R TwitteR软件包授权错误

r - 是否有用于检查路径中是否存在具有特定扩展名的文件的 R 函数?

r - 添加一个新列,将一个字符串映射到一个基于 "Rosetta Stone"数据框的新字符串?

r - 根据另一列最接近 TRUE 值的索引改变新列