如何移除R数据框中单一值占比≥90%的冗余列
实现代码
首先你示例数据里的B列定义有误,需要把字符值加引号修正后才能运行:
# 修正后的示例数据 A <- c(1,2,3,4,1,2,3,4,1,2) B <- c("A","B","C","D","E","F","G","H","I","J") C <- c(1,1,1,1,1,1,1,1,1,0) D <- c(TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE) df1 <- data.frame(A,B,C,D)
dplyr 1.0及以上推荐写法(用where()代替已弃用的select_if)
library(dplyr) df_result <- df1 %>% select(where(~ max(prop.table(table(.x))) < 0.9))
旧版dplyr的select_if写法
df_result <- df1 %>% select_if(~ max(prop.table(table(.x))) < 0.9)
逻辑说明
- 对每一列先通过
table()统计各取值的出现频数 - 用
prop.table()把频数转为占总行数的比例 - 取该列占比最高的单一值的比例,判断是否小于90%
- 仅保留最高占比小于90%的列,也就是删除单一值占比≥90%的列
上面的示例运行后会保留A、B两列,C、D列因为最高占比刚好达到90%会被删除。
基础R实现方式
如果你不想加载dplyr,也可以用基础R语法实现相同效果:
df_result <- df1[, sapply(df1, function(x) max(prop.table(table(x))) < 0.9)]
内容的提问来源于stack exchange,提问作者spencergadd
相关产品推荐
相关产品推荐

