我有分类变量,我将它们转换成虚拟变量,得到了超过2381个变量。我不需要那么多变量来进行分析(比如回归或相关)。如果给定列中总值的90%以上是'0‘,我想删除这些列。另外,有没有一个好的度量标准来删除90%的值不是'0‘的列?帮助!
发布于 2018-12-18 16:24:11
这将为您提供一个不带列的data.frame
,其中90%以上的元素是0
df[sapply(df, function(x) mean(x == 0) <= 0.9)]
或者像马库斯建议的那样更有说服力:
df[colMeans(df == 0) <= 0.9]
发布于 2018-12-18 16:18:07
使用colSums
可以轻松完成此操作
示例数据:
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的逐步排除来衡量变量的相关性。
发布于 2018-12-18 16:41:01
嘿,我用dplyr
包写了一些代码。下面是一些示例,您可以删除其中包含超过90%的零的列:
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]
https://stackoverflow.com/questions/53828676
复制相似问题