Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 通过过滤数据帧输出百分位数_R - Fatal编程技术网

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

R 通过过滤数据帧输出百分位数,r,R,请注意,按照评论中的要求,这一问题已作了修订 考虑以下示例: df <- data.frame(FILTER = rep(1:10, each = 10), VALUE = 1:100) 然后我将不得不cbind这些(第一列中1:99),但我不希望键入每个df名称。我曾考虑在这些数据帧的名称上使用循环,但这将涉及使用eval(parse())如何使用get df <- data.frame(1:10) for (i in nums) { df <- cbind(df,

请注意,按照评论中的要求,这一问题已作了修订

考虑以下示例:

df <- data.frame(FILTER = rep(1:10, each = 10), VALUE = 1:100)

然后我将不得不
cbind
这些(第一列中
1:99
),但我不希望键入每个
df
名称。我曾考虑在这些数据帧的名称上使用循环,但这将涉及使用
eval(parse())

如何使用
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

df我建议您使用
列表

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 <- data.frame(FILTER = rep(1:10, each = 10), VALUE = 1:100)
df_s <- lapply(split(df,df$FILTER),
                             FUN = function(x) quantile(x$VALUE,probs = c(0.25,0.5,0.75)))
out <- do.call(cbind,df_s)
colnames(out) <- paste0("df_",colnames(out))

> out
    df_1  df_2  df_3  df_4  df_5  df_6  df_7  df_8  df_9 df_10
25% 3.25 13.25 23.25 33.25 43.25 53.25 63.25 73.25 83.25 93.25
50% 5.50 15.50 25.50 35.50 45.50 55.50 65.50 75.50 85.50 95.50
75% 7.75 17.75 27.75 37.75 47.75 57.75 67.75 77.75 87.75 97.75

df可能是
mget
do.call
,但这里真正的问题是,您的列表中没有所有的
df_1、df_2
等。要获得最佳答案,请告诉我们您是如何生成这些数据的。frames?没有详细说明,但您是否使用循环来读取CSV中使用的
assign
?请参阅中的gregor的答案,以了解遵循joran建议的一些优势。您不需要发布准确的数据,只需以相同的格式发布数据即可。我不同意你关于这些背景问题无关紧要的评估。有经验的R程序员阅读您的描述并识别您所处的位置,因为他们以前去过那里,并且知道这是由创建
df
对象时的次优决策造成的。老实说,我们是想帮忙。我猜早些时候你最好使用
split
,但是如果没有更多的信息就不可能说出来。@joran我已经做了一个实质性的修改。我理解不推荐它的原因,但他的问题是:“我想用循环找到它们。”请注意,正如评论中所要求的,我已经修改了我的问题。请注意,根据评论中的要求,我已经修改了我的问题。感谢您的建议:我已经用do.call替换了第二个循环。但是,您将如何使用lapply分配dfs列表?我感谢您在这个问题上的帮助!谢谢-我不敢相信我不知道
split
do.call
直到现在!:)
   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
df <- data.frame(FILTER = rep(1:10, each = 10), VALUE = 1:100)
df_s <- lapply(split(df,df$FILTER),
                             FUN = function(x) quantile(x$VALUE,probs = c(0.25,0.5,0.75)))
out <- do.call(cbind,df_s)
colnames(out) <- paste0("df_",colnames(out))

> out
    df_1  df_2  df_3  df_4  df_5  df_6  df_7  df_8  df_9 df_10
25% 3.25 13.25 23.25 33.25 43.25 53.25 63.25 73.25 83.25 93.25
50% 5.50 15.50 25.50 35.50 45.50 55.50 65.50 75.50 85.50 95.50
75% 7.75 17.75 27.75 37.75 47.75 57.75 67.75 77.75 87.75 97.75