【问题标题】:Is there a way I can get R to calculate my csv file to show me the percentiles?有没有办法让 R 计算我的 csv 文件以显示百分位数?
【发布时间】:2020-09-01 16:47:19
【问题描述】:

我已经尝试使用分位数功能,但它没有按预期工作,我已经用完了选项,所以我向你的 R 大师寻求帮助。

假设我们找到了我提到百分位数的 P50。

一个示例数据集是

  Date           data
  2020-01-01      49.5
  2020-02-01      49.7
  2020-03-14      48.5
  2020-05-02      50.2

我正在尝试让脚本使用它之前的列生成百分位数输出

  Date           data    V1     V2      V3
  2020-01-01      49.5   49.6   49.6    49.5625
  2020-02-01      49.7   49.7   49.525
  2020-03-14      48.5   49.35
  2020-05-02      50.2

这在 V1 中试图完成的是在数据列中使用 48.5 和 50.2 找到一个百分位数,以得到 V1 中的 49.6,V1 中 49.7 的结果应该是使用 50.2、48.5 和 49.7 等的百分位数结果。然后 V2 49.525 的结果是在 V1 中使用 49.35 和 49.7 的百分位数的结果,而 V2 中的结果 49.6 是 49.35、49.7、49.6 等的百分位数,在 V3 中,49.5625 的结果是通过使用 V2 找到百分位数49.525 和 49.6

并继续这样做,直到完成整个数据集。

然后在完成此操作后,在不改变输出的情况下降低结果:

  Date           data    V1     V2      V3
  2020-01-01      49.5   NA     NA      NA
  2020-02-01      49.7   49.6   NA      NA
  2020-03-14      48.5   49.7   49.6    NA
  2020-05-02      50.2   48.35  49.525  49.5625

【问题讨论】:

  • 您说您想找到“第 45 个百分位”,但我不清楚您想要计算第 45 个百分位 的内容。例如,quantile(1:10,0.45) 的计算结果为 5.05。你想计算什么来代替1:10quantile(c(10,20),0.45)quantile(c(10,20,30),0.45)?
  • 我基本上是在尝试自动化我通常在 excel 中手动执行的过程(在 excel 中需要花费大量时间,平均 1-2 个月)只是找到每行的百分位数因为它计算。所以基本上你会拿你的第一列,复制那一列,在它旁边的空列中向上移动一行并粘贴。之后,您移动到它旁边的列,然后向上移动一行并要求 Excel 逐行查找您要查找的任何百分位数。您会每隔一段时间继续这样做,直到到达数据集的开始日期。

标签: r rstudio rscript


【解决方案1】:

这是一个不寻常的算法。当您说第 45 个百分位数时,我认为您的意思是所讨论数字的 0.45 倍。

按照您的建议尝试移动行将非常缓慢和复杂,但您仍然应该能够迭代地获得解决方案。从您的示例中不清楚您到底想要什么(您的数字与您对数字应该发生的事情的描述不匹配),但是根据您对算法的描述,这是一个可行的解决方案。我已经包含了一个更长的数据框,这样您就可以确保数字符合您的期望。

df <- data.frame(Date = as.Date(c("2002/1/1", "2002/3/2", "2002/4/15",
                                  "2003/1/1", "2003/3/2", "2003/4/15")),
                 Data = 1:6 * 10)

for(i in 2:nrow(df)) df[[i + 1]] <- dplyr::lag(apply(df[-1], 1, sum) * 0.45)

df
#>         Date Data   V3     V4       V5       V6       V7
#> 1 2002-01-01   10   NA     NA       NA       NA       NA
#> 2 2002-03-02   20  4.5     NA       NA       NA       NA
#> 3 2002-04-15   30  9.0 11.025       NA       NA       NA
#> 4 2003-01-01   40 13.5 17.550 22.51125       NA       NA
#> 5 2003-03-02   50 18.0 24.075 31.97250 42.10256       NA
#> 6 2003-04-15   60 22.5 30.600 41.43375 55.82138 74.76753

请注意,在 R 中,与 Excel 不同,您不能将数字列中的单元格留空 - 它们将包含 NA


更新

根据来自 OP 的进一步信息,以下函数执行所描述的算法。这里df是最右边一列带有“count”的数据框,你可以放任何你喜欢的百分位数。

make_percentiles <- function(df, percentile = 50)
{
  df_names <- names(df)
  percentile <- percentile/100
  f <- function(x, p) c(NA, x[-length(x)]) + p * c(NA, diff(x))
  while(length(which(!is.na(df[[length(df)]]))) > 1) 
  {
    df <- cbind(df, f(df[[length(df)]], percentile))
  }
  setNames(df, c(df_names, paste0("v", 1:(length(df) - length(df_names)))))
}

所以现在很简单:

make_percentiles(df, 50)
#>         Date data    v1     v2      v3
#> 1 2020-01-01 49.5    NA     NA      NA
#> 2 2020-02-01 49.7 49.60     NA      NA
#> 3 2020-03-14 48.5 49.10 49.350      NA
#> 4 2020-05-02 50.2 49.35 49.225 49.2875

make_percentiles(df, 45)
#>         Date data     v1       v2       v3
#> 1 2020-01-01 49.5     NA       NA       NA
#> 2 2020-02-01 49.7 49.590       NA       NA
#> 3 2020-03-14 48.5 49.160 49.39650       NA
#> 4 2020-05-02 50.2 49.265 49.20725 49.31134

【讨论】:

  • 谢谢!百分位数是我作为示例提取的随机百分位数以及数字,但这看起来可能有效。我试试看。
  • 所以我尝试了上面的方法,但它并没有达到预期的效果,我想我有一个更好的例子可以展示给你,我已经更新了问题来展示它。
  • @Island868 很抱歉,即使有你的更新,我也不明白。当您说“在数据列中使用 48.5 和 50.2 查找百分位数以得出 48.4”时。这是什么意思?你究竟是如何从 48.5 和 50.2 得到 48.4 的?这是一个百分位数?
  • 我以它为例,说它是中位数(P50),所以基本上当我说百分位数时,假设数据列中的 P50 48.5 和 50.2 结果为 48.4(我知道这不是实际的 P50)。顺便说一句,如果我在 excel 中实际计算出 P50 并将示例替换为实际数字会更有帮助吗?
  • 使用 excel 中的百分位数函数对数字进行了更新以获取它们。
猜你喜欢
  • 2023-03-21
  • 2017-11-08
  • 1970-01-01
  • 2018-09-05
  • 2019-02-06
  • 2017-05-09
  • 2016-12-01
  • 2020-07-31
  • 1970-01-01
相关资源
最近更新 更多