计算 R 中多列中最高和最低的 10% 值

Calculate top & lowest ten percent values in multiple columns in R

加载库和示例数据:

library(MASS)
View(Cars93)
Cars93$ID=1:93

现在我想对 Cars93 进行子集化,以便新的 df(sub0lsub0h)具有所有列的所有 ID,但只有顶部(对于 df sub0h ) 和列 17:25 中的最低 10% 值(对于 df sub0l)和其余值(df sub0l 的 11-100 四分位数和 df sub0h 的 0-90 四分位数) 可以更改为 NA。

这是我尝试创建两个 dfs,其中前 10% 或最低 10% 的值来自列 17:25:

sub0l <- do.call(rbind,by (Cars93,Cars93$ID,FUN= function(x) 
  subset(Cars93, (Cars93[,17:25] <= quantile(Cars93[,17:25], probs=  .10)))))

sub0h <- do.call(rbind,by (Cars93,Cars93$ID,FUN= function(x) 
  subset(Cars93, (Cars93[,17:25] >= quantile(Cars93[,17:25], probs=  .91)))))

我在对列的最高和最低十个四分位数进行子集化时出错:

Error in `[.data.frame`(Cars93, ,17:25) : undefined columns selected
Called from: `[.data.frame`(Cars93, ,17:25)

还有更好的选择吗?

我觉得下面returns你要找的是什么

sub0l <- cbind(Cars93[,1:16], sapply(Cars93[,17:25], 
                  function(i) ifelse(i > quantile(i, probs=0.1, na.rm=T) | is.na(i), NA, i)))

sub0h <- cbind(Cars93[,1:16], sapply(Cars93[,17:25], 
                 function(i) ifelse(i < quantile(i, probs=0.91, na.rm=T) | is.na(i), NA, i)))

sapply 函数循环遍历应用分位数函数的 data.frame 中的每个变量。在每次传递中,泛型函数通过 "i" 参数将变量作为向量访问。然后将其传递给 ifelse 函数。此函数查看向量 i 的每个元素并评估它是否通过测试。如果该元素通过测试,则为其分配 NA,如果失败,则返回其原始值。此过程非常适用于数字变量。

如果一些变量不是数字,那么您可以在 sapply 函数中添加额外的检查,如下所示:

sub0l <- cbind(Cars93[,1:16], 
               sapply(Cars93[,17:25], 
                 function(i) {
                   if(is.numeric(i)) {
                     ifelse(i > quantile(i, probs=0.1, na.rm=T) | is.na(i), NA, i)))
                   }
                   else i
                 }))

sub0h <- cbind(Cars93[,1:16], 
               sapply(Cars93[,17:25],
                 function(i) {
                   if(is.numeric(i)) {
                     ifelse(i < quantile(i, probs=0.91, na.rm=T) | is.na(i), NA, i)
                   }
                   else i
                 }))

在开始上述操作之前,泛型函数检查向量 i 是否为数字类型(在 R 中,这是模式双精度或整数,请参阅 ?typeof 以了解核心元素类型的讨论在R)。如果此测试失败,则向量由 else i 返回。如果第一个测试通过,则上述过程开始。