通过过滤数据帧输出百分位数

时间:2016-07-06 15:28:28

标签: r

请注意,根据评论的要求,此问题已经修订。

考虑以下示例:

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())

3 个答案:

答案 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
相关问题