我尝试过使用分位数函数,但它没有按预期执行,我已经没有选择,所以我向你们 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