请注意,根据评论的要求,此问题已经修订。
考虑以下示例:
df <- data.frame(FILTER = rep(1:10, each = 10), VALUE = 1:100)
我想,对于FILTER
的每个值,创建一个包含VALUE
的第1,第2,......,第99百分位数的数据框。最终产品应该是
PERCENTILE df_1 df_2 ... df_10
1 [first percentiles]
2 [second percentiles]
等,其中df_i
基于FILTER == i
。
请注意,FILTER
虽然包含数字,但实际上是明确的。
我这样做的方法是使用dplyr
:
nums <- 1:10
library(dplyr)
for (i in nums){
df_temp <- filter(df, FILTER == i)$VALUE
assign(paste0("df_", i), quantile(df_temp, probs = (1:99)/100))
}
然后我必须cbind
这些(在第一列中使用1:99
),但我宁愿不输入每个df
名称。我考虑过对这些数据框的名称使用循环,但这涉及使用eval(parse())
。
答案 0 :(得分:1)
我建议您使用list
。
list_of_dfs <- list()
nums <- 1:10
for (i in nums){
list_of_dfs[[i]] <- nums*i
}
df <- data.frame(list_of_dfs[[1]])
df <- do.call("cbind",args=list(df,list_of_dfs))
colnames(df) <- paste0("df_",1:10)
你会得到你想要的结果:
df_1 df_2 df_3 df_4 df_5 df_6 df_7 df_8 df_9 df_10
1 1 2 3 4 5 6 7 8 9 10
2 2 4 6 8 10 12 14 16 18 20
3 3 6 9 12 15 18 21 24 27 30
4 4 8 12 16 20 24 28 32 36 40
5 5 10 15 20 25 30 35 40 45 50
6 6 12 18 24 30 36 42 48 54 60
7 7 14 21 28 35 42 49 56 63 70
8 8 16 24 32 40 48 56 64 72 80
9 9 18 27 36 45 54 63 72 81 90
10 10 20 30 40 50 60 70 80 90 100
答案 1 :(得分:1)
这是一个可能更平滑的方法的基本概述。我没有包含所需输出的每个方面,但修改应该相当简单。
ContextCompat
我只为3个分位数做了这个以保持简单,但它显然延伸了。然后您也可以添加1:99列。
答案 2 :(得分:0)
如何使用get
?
df <- data.frame(1:10)
for (i in nums) {
df <- cbind(df, get(paste0("df_", i)))
}
# get rid of first useless column
df <- df[, -1]
# get names
names(df) <- paste0("df_", nums)
df