0

图表,我已经下来了。挑战是我有 _exact_same_code_ 用于绘制多个数据集(更确切地说,是一个 LARGE 数据集的子集),但我似乎无法正确获取循环代码来正确替换 $。

数据集,df1, df2, df3...的形式:

OBSDATE     REGION  AVG_RESP  P10  P90
2012-02-01  APAC    1.276     0.78 3.45
2012-02-01  EMEA    2.341     1.23 5.67
2012-02-02  APAC    1.343     0.89 3.21
2012-02-02  EMEA    2.473     1.37 5.98

该图更复杂,但像这样:

avgMx <- quantile(df1$P90,0.95)
ggplot(df1,aes(x=OBSDATE,y=AVG_RESP))+coord_cartesian(ylim=c(0,avgMx))+geom_ribbon(aes(ymin=P10,ymax=P90),fill="gray60",alpha=0.33)+geom_line(aes(x=OBSDATE,y=AVG_RESP),color="#007DB1",size=0.5)+facet_wrap(~REGION)

如果我用数据集名称定义一个向量或列表(两者似乎都失败并显示相同的错误消息),我无法让循​​环工作以找到任何描述性值(如上面的分位数甚至最大值!)

filenames <- c("df1","df2","df3")

我想让这样的东西工作

for (i in filenames) {
   quantile(i$AVG_RESP,0.95)
   max(i$AVG_RESP)
}

但是我得到关于 $ 对原子向量无效的错误。经过调查,这似乎没有产生任何可用的结果。

所以,我可以让它工作:

max(df1$AVG_RESP) or max(df1['AVG_RESP'])

他们都会从上面输出 2.473。但是,这不会飞:

for (i in pagesC) max(i['AVG_RESP'])

它什么也不做。将其更改为:

for (i in pagesC) print(max(i['AVG_RESP']))

给出 NA 的实例。

我完全被困住了。任何帮助将不胜感激!

编辑:我修复了导致错误的数据 - 现在应该可以重现了。

4

2 回答 2

3

i是一个字符串;您想要名称保存在 中的对象i。这就是get()功能。(未经测试,因为您提供的内容不可复制。)

for (filename in filenames) {
   i <- get(filename)
   quantile(i$AVG_RESP,0.95)
   max(i$AVG_RESP)
}

不过,这可能不是解决问题的最佳方法。将所有数据框放在一个列表中并循环遍历该列表lapply可能是一种更好的方法(泰勒在他的回答中描述了这一点)。此外,如果这些是您由更大的单个数据框组成的子集,那么更好的方法是使用plyr包中的某些内容来定义如何拆分大数据框以及如何处理每个部分.

于 2012-04-11T21:57:11.253 回答
3

您的代码不可重现,所以这是我对您想要的最好的猜测:

df1 <- df2 <- df3 <- read.table(text="OBSDATE     REGION  AVG_RESP  P10  P90
2012-02-01  APAC    1.276     0.78 3.45
2012-02-01  EMEA    2.341     1.23 5.67
2012-02-02  APAC    1.343     0.89 3.21
2012-02-02  EMEA    2.473     1.37 5.98
2012-02-01  APAC    1.276     0.78 3.45
2012-02-01  EMEA    2.341     1.23 5.67
2012-02-02  APAC    1.343     0.89 3.21
2012-02-02  EMEA    2.473     1.37 5.98
2012-02-01  APAC    1.276     0.78 3.45
2012-02-01  EMEA    2.341     1.23 5.67
2012-02-02  APAC    1.343     0.89 3.21
2012-02-02  EMEA    2.473     1.37 5.98", header=TRUE)

info <- function(dataframe){
    c(quantile(dataframe$AVG_RESP,0.95), max(dataframe$AVG_RESP))
}

LIST <- list(df1, df2, df3)
lapply(LIST, info)   
#Or you may want to use sapply if you want it to return a matrix
sapply(LIST, info) 

R 可以使用循环,但这确实不是 R 做事的方式。

于 2012-04-11T21:48:09.160 回答