如何提取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
代码逻辑解释
- 判断函数
is_not_only_01:- 先提取列的所有唯一值,避免重复判断;
- 用
all(unique_vals %in% c("0", "1", 0, 1))检查所有值是否都是0或1(同时考虑字符型和数值型的情况); - 加
!取反,得到“不是仅包含0/1”的判断结果。
- 筛选列:
keep(或Filter)会遍历DataFrame的每一列,保留符合is_not_only_01条件的列;- 最后用
names()提取这些列的名称,就是你要的向量。
内容的提问来源于stack exchange,提问作者Haakonkas
相关产品推荐
相关产品推荐

