有没有办法让 R 计算我的 csv 文件以显示百分位数?



我尝试过使用分位数函数,但它没有按预期执行,我已经没有选择,所以我向你们 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 的结果是使用 49.525 和 49.6 从 V2 中找到百分位数

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

然后,当这样做时,在不改变输出的情况下降低结果,从而导致:

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 个百分位数时,我认为你的意思是相关数字的 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

最新更新