我想使用 dplyr::relocate 对某些列重新排序,使其位于特定的其他列之后。这是一个 MWE:
a <- letters[1:3]
b <- letters[4:6]
c <- letters[7:9]
d <- letters[10:12]
mytib <- tibble::tibble(a,b,c,d)
# A tibble: 3 x 4
# a b c d
# <chr> <chr> <chr> <chr>
# 1 a d g j
# 2 b e h k
# 3 c f i l
mytib %>%
relocate(c, .after = a)
Run Code Online (Sandbox Code Playgroud)
这个例子有效,但是有没有一种方法可以通过一个重定位命令将 c 移到 a 之后,例如将 d 移到 b 之后?
我尝试了以下操作但没有成功:
mytib %>%
relocate(c(c, d), .after(c(a, b)))
Run Code Online (Sandbox Code Playgroud)
编辑1:我明确询问relocate,因为像这样的函数select不适用于大型数据集,我所知道的是在我想要插入列的哪一列(名称)之后。
编辑2:这是我的预期输出:
# A tibble: 3 x 4
# a c b d
# <chr> <chr> <chr> <chr>
# 1 a g d j
# 2 b h e k
# 3 c i f l
Run Code Online (Sandbox Code Playgroud)
由于dplyr::relocate其本身显然不允许成对重新定位,因此您可以通过准备列对列表来“破解”此行为,例如您所描述的列对列表(“a 之后的 c”和“b 之后的 d”)并在reduce该列表上传递您的df 作为一个.init值,并在每个归约步骤中重新定位一对。
像这样:
library(dplyr)
library(purrr)
df_relocated <- reduce(
.x = list(c('c','a'), c('d','b')),
.f = ~ relocate(.x, .y[1], .after = .y[2]),
.init = mytib
)
Run Code Online (Sandbox Code Playgroud)
这会产生一个小标题,正如您所期望的那样:
> df_relocated
# A tibble: 3 x 4
a c b d
<chr> <chr> <chr> <chr>
1 a g d j
2 b h e k
3 c i f l
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8220 次 |
| 最近记录: |