【发布时间】:2018-06-19 20:04:27
【问题描述】:
library(tidyverse)
#> Warning: package 'tidyverse' was built under R version 3.4.4
#> Warning: package 'forcats' was built under R version 3.4.4
example <- tibble(
num1 = sample(1:100, 10),
categ1 = as.factor(c(sample(letters, 10))),
num2 = sample(1:100, 10),
categ2 = as.factor(c(sample(letters, 10)))
)
head(example)
#> # A tibble: 6 x 4
#> num1 categ1 num2 categ2
#> <int> <fct> <int> <fct>
#> 1 4 c 5 l
#> 2 86 u 64 b
#> 3 38 z 18 r
#> 4 95 e 44 j
#> 5 77 w 35 u
#> 6 84 y 14 i
由reprex package (v0.2.0) 于 2018 年 6 月 19 日创建。
上面的示例显示了一个包含整数和因子数据类型列的基本数据框。在这个小例子中,很容易使用 dplyr 中的select(example, categ1, categ2, num1, num2) 来手动选择您希望列出现的顺序。
但是假设您有许多列是混合数据类型的,并且您希望首先选择所有因素,然后再选择其他所有因素(或基于数据类型的任何特定顺序)?
手动输入每个列的名称或使用 select() 像 contains() 这样的助手可能会很快变得乏味,因为有无数列。我更喜欢 tidyverse 解决方案,但也对如何在基础 R 中实现这一点感兴趣。
【问题讨论】:
-
你有更多的课程吗?试试
map(list(is.factor, is.numeric), ~ example %>% select_if(.x)) %>% bind_cols -
更多数据类型是可能的。如果需要,这可行并且似乎允许许多数据类型。我想知道如果你有一个大数据集,这种方法的计算成本有多高。
-
如果数据很大,那么您可以对第一行进行子集化并从中取出类,例如
example %>% slice(1) %>% map_chr(class) %>% sort %>% names %>% select(example, .) -
聪明。谢谢,阿克伦!