删除超过 30% 的重复值或超过 1% 的值超出由 r 中的平均值 +- 2.5 SD 定义的范围的列

Delete columns that had more than 30% of repeated values or more than 1% of values outside the range defined by the mean +- 2.5 SD in r

可能是data edition的基础问题,但是我在stack overflow中没有找到类似的问答。

我有一个大约 18 行 x 200 列的数据框。 这是一个简化的玩具示例:

DF <- data.frame(x1=c(0.1,1,0.7,765,0.4,0.3,0.5,3.6,5,11), x2=c(2,2,6,7,6,6,4,2,2,2), x3=c(4,2,3,4,5,4.2,4.6,2.2,2.7,2.8))

我想删除重复值超过 30% 的所有列,在本例中为 x2 列。在玩具示例中,由于有超过 30% 的重复值(许多重复的 2 和 6),应被删除。

我还想删除超过 1% 的值超出平均值 +- 2.5 SD 定义的范围的列。在玩具示例中,应删除列 x1,因为 SD sqrt(var(DF$x1))= 241.14 且平均值 mean(DF$x1) = 78.76,因此平均值 + 2.5 SD = 78.76 + (2.5*241.14) = 681.61,而在DF$x1中有一个比这个大的值,代表DF$x1中值的10%(由于table中只有十行)

编写一个函数,其中包含要用于删除列的所有规则。

remove_col <- function(x) {
  tab <- table(x)
  sd <- sd(x)
  mn <- mean(x)
  
  !(mean(x %in% names(tab[tab > 1])) > 0.3 || 
      sum(x > mn + 2.5 * sd | x < mn - 2.5 * sd) > 0.01*length(x))
}

Filter一起使用。

Filter(remove_col, DF)

#    x3
#1  4.0
#2  2.0
#3  3.0
#4  4.0
#5  5.0
#6  4.2
#7  4.6
#8  2.2
#9  2.7
#10 2.8