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