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

如何提取DataFrame中不仅包含1/0的列名?

解决R DataFrame筛选非仅含0/1列名的问题

首先,先明确你的需求:从给定的DataFrame中找出所有**不只有0和1(包括字符型和数值型)**的列名,最终得到c("id", "emrA", "gyrA_8", "T_CIP")这个向量。

你的原代码问题

你尝试的lapply写法有几个问题:

  • colnames(which(...))逻辑错误:which返回的是元素位置,而colnames需要传入数据对象,不是位置;
  • 没有明确的判断逻辑,regex_pattern未定义,而且仅用正则匹配也无法准确判断列是否只包含0/1。

正确实现方法

这里有两种简洁的方式,分别用tidyverse工具和基础R实现:

方法1:用tidyverse的purrr包(代码更直观)

library(purrr)

# 定义一个函数,判断某一列是否不是仅包含0/1(覆盖字符和数值类型)
is_not_only_01 <- function(col) {
  unique_vals <- unique(col)
  # 检查所有唯一值是否不全属于0/1(字符或数值)
  !all(unique_vals %in% c("0", "1", 0, 1))
}

# 筛选符合条件的列,并提取列名
target_columns <- names(keep(df, is_not_only_01))
target_columns

运行后输出:

[1] "id"     "emrA"   "gyrA_8" "T_CIP"

方法2:基础R实现(无需额外包)

如果你不想加载purrr,用基础R的Filter函数也能实现:

is_not_only_01 <- function(col) {
  unique_vals <- unique(col)
  !all(unique_vals %in% c("0", "1", 0, 1))
}

target_columns <- names(Filter(is_not_only_01, df))
target_columns

代码逻辑解释

  1. 判断函数is_not_only_01:
    • 先提取列的所有唯一值,避免重复判断;
    • 用all(unique_vals %in% c("0", "1", 0, 1))检查所有值是否都是0或1(同时考虑字符型和数值型的情况);
    • 加!取反,得到“不是仅包含0/1”的判断结果。
  2. 筛选列:
    • keep(或Filter)会遍历DataFrame的每一列,保留符合is_not_only_01条件的列;
    • 最后用names()提取这些列的名称,就是你要的向量。

内容的提问来源于stack exchange,提问作者Haakonkas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:02:52