如何基于列数据类型在pivot_longer中选择列进行透视?
基于列数据类型使用
pivot_longer透视的tidyverse方法 问题场景
想用pivot_longer对数据框做透视,平时习惯通过模式匹配(比如cols = contains(...))选择列,尝试直接基于列的数据类型选列时遇到报错:
df <- data.frame(nums = seq(1,6,1), chrs = letters[1:6], logis = rep(c(TRUE, FALSE), 3), logis2 = rep(c(TRUE, FALSE), 3)) pivot_longer(df, cols = sapply(df, is.logical))
错误提示:cols参数仅接受numeric或character类型数据。
已知的基础解法
先筛选出目标数据类型的列名,再用all_of()传入cols参数:
vars_to_pivot <- names(df)[sapply(df, is.logical)] pivot_longer(df, cols = all_of(vars_to_pivot)) %>% head
输出结果:
# A tibble: 6 × 4 nums chrs name value <dbl> <chr> <chr> <lgl> 1 1 a logis TRUE 2 1 a logis2 TRUE 3 2 b logis FALSE 4 2 b logis2 FALSE 5 3 c logis TRUE 6 3 c logis2 TRUE
更简洁的tidyverse专属解法
有,用where()函数就能直接在cols参数里基于列的属性筛选,无需提前生成列名向量。where()是tidyverse专门用来基于列属性(包括数据类型)选择列的工具,接收一个返回逻辑值的函数,对每一列应用后返回符合条件的列。
示例代码:
pivot_longer(df, cols = where(is.logical)) %>% head
这段代码会直接选中所有逻辑型列完成透视,输出结果和基础解法完全一致。
内容的提问来源于stack exchange,提问作者baobab
相关产品推荐
相关产品推荐

