使用 tidyverse 重新定位行

Tar*_*Jae 4 r dplyr tidyr tidyverse relocate

是否有可能relocate tidyverse框架像它可能与列dplyr 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
Run Code Online (Sandbox Code Playgroud)

期望的输出:

  ID var1 var2
1  2    b    1
2  3    c    0
3  4    d    0
4  5    e    1
5  1    a    1
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*ker 7

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

dplyr::arrange(df, ID==1)
Run Code Online (Sandbox Code Playgroud)

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

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

另一种选择(在我看来不太惯用)是slice()

dplyr::slice(df, order(ID==1))
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句:

df %>% `[`(order(.$ID==1),)
Run Code Online (Sandbox Code Playgroud)


akr*_*run 5

使用 base R

df[order(df$ID == 1), ]
Run Code Online (Sandbox Code Playgroud)

或与 slice

library(dplyr)
df %>%
    slice(2:n(), 1)
Run Code Online (Sandbox Code Playgroud)

或指定 row_number()

df %>% 
   slice(lead(row_number(), default = 1))
Run Code Online (Sandbox Code Playgroud)