You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于列数据类型在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 02:41:05