【发布时间】:2022-01-24 00:34:39
【问题描述】:
我正在寻找一种简单、简洁的方式来使用dplyr::select,而无需重新排列列。
考虑这个数据集:
library(tidyverse)
head(msleep)
#> # A tibble: 6 × 11
#> name genus vore order conservation sleep_total sleep_rem sleep_cycle awake
#> <chr> <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 Cheetah Acin… carni Carn… lc 12.1 NA NA 11.9
#> 2 Owl mo… Aotus omni Prim… <NA> 17 1.8 NA 7
#> 3 Mounta… Aplo… herbi Rode… nt 14.4 2.4 NA 9.6
#> 4 Greate… Blar… omni Sori… lc 14.9 2.3 0.133 9.1
#> 5 Cow Bos herbi Arti… domesticated 4 0.7 0.667 20
#> 6 Three-… Brad… herbi Pilo… <NA> 14.4 2.2 0.767 9.6
#> # … with 2 more variables: brainwt <dbl>, bodywt <dbl>
如果我选择vore、genus 和name,则生成的数据框将按照提供列的顺序排列。
msleep %>% select(vore, genus, name)
#> # A tibble: 83 × 3
#> vore genus name
#> <chr> <chr> <chr>
#> 1 carni Acinonyx Cheetah
#> 2 omni Aotus Owl monkey
#> 3 herbi Aplodontia Mountain beaver
#> 4 omni Blarina Greater short-tailed shrew
#> 5 herbi Bos Cow
#> 6 herbi Bradypus Three-toed sloth
#> 7 carni Callorhinus Northern fur seal
#> 8 <NA> Calomys Vesper mouse
#> 9 carni Canis Dog
#> 10 herbi Capreolus Roe deer
#> # … with 73 more rows
我想保留它们的默认顺序:name、genus,然后是vore。
我有一个解决方案(见下文),但我不喜欢它,因为它很罗嗦,而且不完全是“tidyverse-esque”。 (我正在教授 tidyverse 课程的介绍,并且想要一些不会吓到初学者的东西。)
msleep %>%
select(all_of(names(msleep)[names(msleep) %in% c("vore", "genus", "name")]))
#> # A tibble: 83 × 3
#> name genus vore
#> <chr> <chr> <chr>
#> 1 Cheetah Acinonyx carni
#> 2 Owl monkey Aotus omni
#> 3 Mountain beaver Aplodontia herbi
#> 4 Greater short-tailed shrew Blarina omni
#> 5 Cow Bos herbi
#> 6 Three-toed sloth Bradypus herbi
#> 7 Northern fur seal Callorhinus carni
#> 8 Vesper mouse Calomys <NA>
#> 9 Dog Canis carni
#> 10 Roe deer Capreolus herbi
#> # … with 73 more rows
有这种事吗?谢谢!
对于上下文:实际上,我们有一个包含大约 400 列的数据框,我们一次从中选择约 10-20 列进行处理。原始数据框中的列的顺序是有意义的,但我们不想费力地在 select 语句中以正确的顺序列出它们。我承认这是一个非常具体的需求。
由reprex package (v2.0.1) 于 2021 年 12 月 22 日创建
【问题讨论】:
-
为什么不是
msleep %>% select(1:3)或msleep %>% select(name, genus, vore)? -
是的,好点。我编辑了问题以提供更多背景信息。
-
是的!这确实是最适合初学者的解决方案。可能最终会使用它。我想这不是公认的答案,因为它在技术上不是“
dplyr::selectwithout reordering columns” -
@Adam 您能否在当前答案中包含
relocate选项?然后我会将其标记为已接受的答案。