R语言 删除具有统一值的列

bmvo0sr5  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(158)

我有一个包含100多个列的 Dataframe 。我想根据它们的不一致性过滤这些列。例如,如果有超过90%(或95%或99%)的NA(或0-s,或-999,或任何值)的列,请从 Dataframe 中删除它们。
我可以使用NAs或0-s删除,但问题是我不知道它将是什么值。例如,删除具有超过90% df[, which(colMeans(!is.na(df)) > 0.9)]的NAs

vs3odd8k

vs3odd8k1#

我将简单地使用table来计算每个值出现的次数,当这些值的最大值超过所需的阈值时,您可以丢弃该列。
在下面的玩具例子中,xyz是“常量”。对于x,有96%的NA值,对于y,有99%的0,对于z,有97%的-1(但任何值都可以)。

set.seed(26012023)
df <- data.frame(w = rnorm(100), x = c(rep(NA, 96), rnorm(4)), y = c(rep(0, 99), rnorm(1)),
                 z = c(rep(-1, 97), rnorm(3)))

apply(df, 2, function(x, cutoff = .95) {
   tab <- table(x, useNA = "ifany")
   max_val <- max(tab)
   max_val >= cutoff * length(x)
})

#     w     x     y     z 
# FALSE  TRUE  TRUE  TRUE
bxgwgixi

bxgwgixi2#

我们可以创建一个玩具示例,定义下面的data.frame,名为df

# Seed to make it reproducible
  set.seed(12345)

  df <- data.frame(cbind(Var1 = c(rep(10,19),1),
                         Var2 = sample(letters[1:5],20, prob = c(0.8,0.1,0.5,0.25,0.25), replace = T),
                         Var3 = sample(c("Yes","No"), 20,  prob = c(.95, .05), replace = T),
                         Var4 = sample(1:3, 20, replace = T),
                         Var5 = c(rep(NA,15),rep(1,5))))

然后计算每列单个值的最大频率,最后删除超出所需值的值

# Calculate the maximum frequency for a single value for each column
  aux <- apply(df,2,function(x) max(prop.table(table(x, useNA = "ifany"))))     
# Define new.df as df whithout the columns that have a value more than a 90% of times
  new.df <- df[,-which(aux>.9)]

相关问题