首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在R中将值大于90%的列删除为'0‘

如何在R中将值大于90%的列删除为'0‘
EN

Stack Overflow用户
提问于 2018-12-18 16:05:45
回答 3查看 770关注 0票数 0

我有分类变量,我将它们转换成虚拟变量,得到了超过2381个变量。我不需要那么多变量来进行分析(比如回归或相关)。如果给定列中总值的90%以上是'0‘,我想删除这些列。另外,有没有一个好的度量标准来删除90%的值不是'0‘的列?帮助!

EN

回答 3

Stack Overflow用户

发布于 2018-12-18 16:24:11

这将为您提供一个不带列的data.frame,其中90%以上的元素是0

代码语言:javascript
运行
复制
df[sapply(df, function(x) mean(x == 0) <= 0.9)]

或者像马库斯建议的那样更有说服力:

代码语言:javascript
运行
复制
df[colMeans(df == 0) <= 0.9]
票数 2
EN

Stack Overflow用户

发布于 2018-12-18 16:18:07

使用colSums可以轻松完成此操作

示例数据:

代码语言:javascript
运行
复制
df <- data.frame(x = c(rep(0, 9), 1),
                 y = c(rep(0,9), 1),
                 z = c(rep(0, 8), 1, 1))

> df
   x y z
1  0 0 0
2  0 0 0
3  0 0 0
4  0 0 0
5  0 0 0
6  0 0 0
7  0 0 0
8  0 0 0
9  0 0 1
10 1 1 1

df[, colSums(df == 0)/nrow(df) < .9, drop = FALSE]
   z
1  0
2  0
3  0
4  0
5  0
6  0
7  0
8  0
9  1
10 1

关于有用指标的问题,这在很大程度上取决于您想要分析的内容。即使是0值超过90 %的列也可能对回归模型有用。我会查看变量的内容,或者使用基于AIC或BIC的逐步排除来衡量变量的相关性。

票数 1
EN

Stack Overflow用户

发布于 2018-12-18 16:41:01

嘿,我用dplyr包写了一些代码。下面是一些示例,您可以删除其中包含超过90%的零的列:

代码语言:javascript
运行
复制
library(dplyr)

df <- data.frame(colA=sample(c(0,1), 100, replace=TRUE, prob=c(0.8,02)),
                 colB=sample(c(0,1), 100, replace=TRUE, prob=c(0.99,001)),
                 colC=sample(c(0,1), 100, replace=TRUE, prob=c(0.5,05)),
                 colD=sample(c(0,1), 100, replace=TRUE, prob=c(0,1)),
                 colE=rep(0, 100))

fct <- function (x) x==0

zero_count <- df %>% mutate_all(funs(fct)) %>% summarise_all(sum)

col_filter <- zero_count <= 0.9 * nrow(df)

df_filter <- df[, col_filter]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53828676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档