使用 tidyverse 重新定位行
Relocate rows with tidyverse
是否可以在 tidyverse
框架中 relocate
行 ,就像 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
期望的输出:
ID var1 var2
1 2 b 1
2 3 c 0
3 4 d 0
4 5 e 1
5 1 a 1
注意:在里面应该是'pipe friendly'解决方案。我尝试了很多但一无所获。谢谢。
也许这不是那么优雅,但这里有一个方法:
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
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 答案的简洁翻译)。这些解决方案中的任何一个也可以用管道编写(例如 df %>% arrange(ID==1)
)。
开个玩笑:
df %>% `[`(order(.$ID==1),)
使用base R
df[order(df$ID == 1), ]
或 slice
library(dplyr)
df %>%
slice(2:n(), 1)
或用row_number()
指定
df %>%
slice(lead(row_number(), default = 1))
我们玩个数学把戏
> 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
经过一整天的反复试验和您精彩的回答:
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
是否可以在 tidyverse
框架中 relocate
行 ,就像 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
期望的输出:
ID var1 var2
1 2 b 1
2 3 c 0
3 4 d 0
4 5 e 1
5 1 a 1
注意:在里面应该是'pipe friendly'解决方案。我尝试了很多但一无所获。谢谢。
也许这不是那么优雅,但这里有一个方法:
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
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 答案的简洁翻译)。这些解决方案中的任何一个也可以用管道编写(例如 df %>% arrange(ID==1)
)。
开个玩笑:
df %>% `[`(order(.$ID==1),)
使用base R
df[order(df$ID == 1), ]
或 slice
library(dplyr)
df %>%
slice(2:n(), 1)
或用row_number()
df %>%
slice(lead(row_number(), default = 1))
我们玩个数学把戏
> 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
经过一整天的反复试验和您精彩的回答:
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