7

框架中的行是否可以像列relocate ​​样?tidyversedplyr relocate

在此示例中,我想将第 1 行重新定位到第 5 位(数据帧结束)

我的数据框:

df <- structure(list(ID = c(1, 2, 3, 4, 5), var1 = c("a", "b", "c", 
"d", "e"), var2 = c(1, 1, 0, 0, 1)), class = "data.frame", row.names = c(NA, 
-5L))

df
  ID var1 var2
1  1    a    1
2  2    b    1
3  3    c    0
4  4    d    0
5  5    e    1

期望的输出:

  ID var1 var2
1  2    b    1
2  3    c    0
3  4    d    0
4  5    e    1
5  1    a    1

注意:在它应该是“管道友好”的解决方案中。我尝试了很多,但一无所获。谢谢你。

4

5 回答 5

7

arrange()是用于重新排序行的 tidyverse 动词。它可以(ab)如下使用:

dplyr::arrange(df, ID==1)

ID==1是合乎逻辑的;当它被排序时,值在值FALSE之前TRUE......)

这没有那么灵活relocate()(例如,如何说“移动第 100-200 行,以便它们紧跟在第 1000 行之后”并不是很明显),但是您可能可以找到一种方法来完成大多数任务。

另一种选择(我认为不那么惯用)是slice()

dplyr::slice(df, order(ID==1))

(这是@akrun 的base-R 答案的tidyverse 翻译)。这些解决方案中的任何一个都可以用管道(例如df %>% arrange(ID==1))编写。

只是愚蠢的:

df %>% `[`(order(.$ID==1),)
于 2021-08-12T16:19:45.237 回答
5

使用base R

df[order(df$ID == 1), ]

或与slice

library(dplyr)
df %>%
    slice(2:n(), 1)

或指定row_number()

df %>% 
   slice(lead(row_number(), default = 1))
于 2021-08-12T17:12:42.460 回答
3

也许这不是那么优雅,但这是一种方法:

library(dplyr)

df %>%
  filter(between(row_number(), 2, nrow(df))) %>%
  bind_rows(df[1, ])

  ID var1 var2
1  2    b    1
2  3    c    0
3  4    d    0
4  5    e    1
5  1    a    1
于 2021-08-12T15:46:16.867 回答
3

让我们玩一个数学把戏

> df[order((seq(nrow(df)) -2) %% nrow(df)), ]
  ID var1 var2
2  2    b    1
3  3    c    0
4  4    d    0
5  5    e    1
1  1    a    1

或者

> df %>%
+   arrange(replace(row_number(), 1, n() + 1))
  ID var1 var2
1  2    b    1
2  3    c    0
3  4    d    0
4  5    e    1
5  1    a    1
于 2021-08-12T20:28:43.540 回答
2

经过一整天的反复试验和您的精彩回答:

library(dplyr)

df %>% 
    slice(-1) %>% bind_rows(df %>% slice(1))

输出:

  ID var1 var2
1  2    b    1
2  3    c    0
3  4    d    0
4  5    e    1
5  1    a    1
于 2021-08-12T20:59:38.540 回答