r - 一种基于数据类型按顺序选择列的 R tidyverse 方法
问题描述
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 包(v0.2.0)于 2018 年 6 月 19 日创建。
上面的示例显示了具有整数和因子数据类型列的基本数据框。在这个小例子中,很容易使用select(example, categ1, categ2, num1, num2)
in dplyr手动选择您希望列出现的顺序。
但是假设您有许多混合数据类型的列,并且您希望首先选择所有因素,然后再选择其他所有因素(或基于数据类型的任何特定顺序)?
手动输入每个列名或使用select()
类似的助手可能contains()
会很快变得乏味,因为有无数列。我更喜欢tidyverse解决方案,但也有兴趣如何在基础 R 中实现这一点。
解决方案
具有 3 个类别的列的示例数据
library(tidyverse)
example <- tibble(
num1 = as.character(sample(1:100, 10)),
categ1 = as.factor(c(sample(letters, 10))),
num2 = sample(1:100, 10),
categ2 = as.factor(c(sample(letters, 10)))
)
假设您要按此顺序对列进行排序
my.order <- c('factor', 'integer', 'character')
即因子,然后是整数,然后是字符
你可以做
example %>%
select(sapply(., class) %>% .[order(match(., my.order))] %>% names)
# # A tibble: 10 x 4
# categ1 categ2 num2 num1
# <fct> <fct> <int> <chr>
# 1 y e 94 46
# 2 t b 52 31
# 3 w c 32 57
# 4 k i 27 89
# 5 n d 76 14
# 6 x g 67 40
# 7 c v 16 20
# 8 e z 6 95
# 9 i t 70 13
# 10 g w 57 42
作为一个函数(相同的输出)
order_cols <- function(df, col.order){
df %>%
select(sapply(., class) %>% .[order(match(., col.order))] %>% names)
}
example %>%
order_cols(c('factor', 'integer', 'character'))
推荐阅读
- error-handling - 范围的起始列太小。(第 50 行,文件“清除单元格”)
- oracle - Oracle - 将日期列与 sysdate 进行比较
- powershell - 如何从 powershell 中的行中获取特定值
- wordpress - Arabic is not typing as "right to left" when it's editing in WPBakery
- arrays - How to get missing Computernames in a Active Directory OU
- sorting - 日期排序弹性搜索
- javascript - dunglas mercure 服务器/javascript EventSource withCredentials:mercureAutorisation cookie 未传输
- c# - System.DllNotFoundException - 无法加载 DLL 'wkhtmltox.dll':访问被拒绝
- ios - 在特定时区安排 UILocalNotification
- reactjs - 酶/玩笑:组件(...):渲染没有返回任何内容。这通常意味着缺少 return 语句。或者,不渲染任何内容,返回 null