【问题标题】:Quantile results for the entire dataframe整个数据帧的分位数结果
【发布时间】:2017-03-30 10:41:17
【问题描述】:

我有一个相当大的数据集,由大约 100 个变量和大约 100 万次观测。数据集包含数值变量和分类变量。 我想计算所有数值变量的分位数,所以当我尝试以下操作时: quantile(dat1, c(.10, .30, .5, .75, .9, na.rm = TRUE)

我在 R 中得到一个错误,说“二元运算符的非数字参数”

那么任何人都可以为我推荐合适的代码吗?感谢您的所有帮助和感谢

【问题讨论】:

  • 你的“dat1”是什么?提供一些数据。
  • dat1 是我的数据集的名称
  • 如果我继续为我的 dat1 数据集中的每个数值变量计算分位数,那么它会很耗时,所以我想一次性计算所有数值变量的分位数。
  • @Sathish 我试过你的代码,但它给了我所有数字列的组合值。我想要分别属于每个数字列的所有行的分位数结果。例如,如果 a 和 b 是我的数字列,那么我想要分别为 a 和 b 的分位数结果。谢谢
  • @Rookie 你代码中的括号是错误的。

标签: r quantile


【解决方案1】:

所有数字列的分位数

# sample data with numeric and character class values 
df <- data.frame(a = 1:5, b= 1:5, c = letters[1:5])
col_numeric <- which( sapply(df, is.numeric ) )   # get numeric column indices
quantile( x = unlist( df[,  col_numeric] ), 
          c(.10, .30, .5, .75, .9),
          na.rm = TRUE )

# 10% 30% 50% 75% 90% 
#  1   2   3   4   5 

单个数字列的分位数

sapply( col_numeric, function( y ) {
  quantile( x = unlist( df[,  y ] ), 
            c(.10, .30, .5, .75, .9),
            na.rm = TRUE )
})

#       a   b
# 10% 1.4 1.4
# 30% 2.2 2.2
# 50% 3.0 3.0
# 75% 4.0 4.0
# 90% 4.6 4.6

由于您的真实数据很大,您可以使用data.table 库来提高效率。

library('data.table')
setDT(df)[, lapply( .SD, quantile, probs = c(.10, .30, .5, .75, .9), na.rm = TRUE ), .SDcols = col_numeric ]

【讨论】:

  • 感谢 Sathish,第二段代码非常适合我。
  • 有没有一种方法可以将第二段代码的结果以数据框的形式存储,其中 10%、30%、50%、75% 和 90% 放置在列中,并且数值变量 a 和 b 被放置为行。再次感谢。
  • 通过data.frame( t( results ) )转置你的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 2021-12-13
  • 2021-01-24
  • 1970-01-01
相关资源
最近更新 更多