【问题标题】:Arrange rows in custom order in R using a vector使用向量在 R 中按自定义顺序排列行
【发布时间】:2022-01-31 06:45:30
【问题描述】:

这类似于:Arranging rows in custom order using dplyr 但我正在寻找不同的结果...

v1 <- rep(LETTERS[1:3], each = 2)
v2 <- rep(c("Seg1", "Seg2"), times = 3)
v3<- c(300,200,500,700,600,550)
df<- data.frame(v1,v2,v3)

这是我原来的 df,我们看到了 A、A、B、B、C、C 的顺序 我想更改顺序,所以它将是 C、A、B、C、A、B 我尝试使用

df %>%
    arrange(match(v1, c("C", "A", "B")), desc(v2), desc(v3))

但这给了我们一个看起来像 C,C,A,A,B,B 的结果

原始df:

我想要的结果:

我得到了不想要的结果:

【问题讨论】:

  • 您的问题有点不清楚,但我认为您希望 v2 作为主键? df[order(df$v2, match(df$v1, c("C", "A", "B"))),]

标签: r dataframe vector dplyr


【解决方案1】:
v1 <- rep(LETTERS[1:3], each = 2)
v2 <- rep(c("Seg1", "Seg2"), times = 3)
v3<- c(300,200,500,700,600,550)
df<- data.frame(v1,v2,v3)

library(tidyverse)
df %>% 
  arrange(v2, factor(v1, levels = c("C", "A", "B"))) 
#>   v1   v2  v3
#> 1  C Seg1 600
#> 2  A Seg1 300
#> 3  B Seg1 500
#> 4  C Seg2 550
#> 5  A Seg2 200
#> 6  B Seg2 700

reprex package (v2.0.1) 于 2022-01-31 创建

【讨论】:

  • 谢谢,这正是我想要做的!
【解决方案2】:

如果你的数据集只有六行,我们可以slice()取出其中的一部分,找出切片后的和原来的区别,然后绑定在一起。

v1 <- rep(LETTERS[1:3], each = 2)
v2 <- rep(c("Seg1", "Seg2"), times = 3)
v3<- c(300,200,500,700,600,550)
df<- data.frame(v1,v2,v3)

sequence <- c("C", "A", "B")

df2 <- df %>% slice(match(sequence, v1))

rbind(setdiff(df, df2) %>% slice(match(sequence,v1)), df2)

  v1   v2  v3
1  C Seg2 550
2  A Seg2 200
3  B Seg2 700
4  C Seg1 600
5  A Seg1 300
6  B Seg1 500

但是,我不认为这是一个聪明的做法,因为如果你有两个以上的"C", "A", "B",它就会变得复杂。

【讨论】:

  • 这只是一个示例,但实际数据集包含 100 行,因此其他解决方案对我来说效果更好。不过谢谢
猜你喜欢
  • 2016-12-28
  • 2018-02-18
  • 2013-07-19
  • 2021-04-02
  • 2021-12-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2012-12-21
相关资源
最近更新 更多