使用 tidyverse 重新定位行

Relocate rows with tidyverse

提问人:TarJae 提问时间:8/12/2021 最后编辑:M--TarJae 更新时间:5/31/2023 访问量:3951

问:

是否可以像使用relocatetidyversedplyrrelocate

在此示例中,我想将第 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

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

r dplyr 搬迁

评论


答:

3赞 Anoushiravan R 8/12/2021 #1

也许这不是那么优雅,但这里有一个方法:

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

评论

1赞 TarJae 8/12/2021
这很好,但必须有更好的解决方案!谢谢你,亲爱的我的朋友!
1赞 TarJae 8/13/2021
bind_rows这是一个很好的方向,与其他答案一起得到我的答案!
0赞 Anoushiravan R 8/13/2021
不客气,亲爱的朋友,很高兴它帮助了:)
9赞 Ben Bolker 8/13/2021 #2

arrange()是用于重新排序行的整洁动词。它可以(ab)按如下方式使用:

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

(ID==1是合乎逻辑的;当它被排序时,值先于值......FALSETRUE

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

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

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

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

只是傻一点:

df %>% `[`(order(.$ID==1),)
4赞 akrun 8/13/2021 #3

base R

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

或者用slice

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

或指定row_number()

df %>% 
   slice(lead(row_number(), default = 1))

评论

1赞 Ben Bolker 8/13/2021
这些都很好。我仍然认为是最惯用的......arrange()
2赞 ThomasIsCoding 8/13/2021 #4

让我们玩一个数学把戏

> 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

评论

0赞 TarJae 8/13/2021
这很好。但我希望 df %>% 安排(1 == 5) 或类似的东西:-)
1赞 ThomasIsCoding 8/13/2021
@TarJae 哈哈,我明白了。那我就得好好想想:)
1赞 ThomasIsCoding 8/13/2021
@TarJae我添加了另一个选项,因此您可以检查它是否适合您。
2赞 TarJae 8/13/2021 #5

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

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