【问题标题】:Calculate top & lowest ten percent values in multiple columns in R计算 R 中多列中最高和最低 10% 的值
【发布时间】:2016-08-16 07:46:15
【问题描述】:

加载库和示例数据:

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

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

这是我尝试从 17:25 列创建两个具有前 10% 或最低 10% 值的 df:

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)

还有更好的选择吗?

【问题讨论】:

    标签: r function subset rbind


    【解决方案1】:

    我认为以下内容会返回您正在寻找的内容

    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 返回。如果第一个测试通过,则上述过程开始。

    【讨论】:

    • 感谢您的评论。我仍然收到错误“quantile.default(i, probs = 0.1, na.rm = T) 错误:不允许使用因子。调用自:quantile.default(i, probs = 0.1, na.rm = T)”
    • 不同但相似的数据集
    • 谢谢;是的,数据中有因素。能否请您稍微解释一下您的代码,以便对阅读这篇文章的其他人有所帮助?如果你不想,也没关系。对于可能面临类似问题的其他读者;在运行上面的代码之前尝试这些代码并回答:sapply(df, mode)、sapply(df, class)、which( colnames(df)=="column name" ) 用于检查 df 中列的模式、类和位置。
    猜你喜欢
    • 1970-01-01
    • 2021-03-10
    • 2021-08-22
    • 2020-12-31
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    相关资源
    最近更新 更多