如何循环遍历数据集以仅绘制特定列的图形?

时间:2012-04-11 21:38:49

标签: r loops ggplot2 dataframe

图表,我已经失败了。 挑战在于我有_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的实例。

我完全卡住了。任何帮助都会非常感激!

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

2 个答案:

答案 0 :(得分: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的做法。

答案 1 :(得分:3)

i是一个字符串;你想要具有i中所有名称的对象。这是get()函数。 (未经测试,因为你提供的是不可重复的。)

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

但这可能不是解决问题的最佳方法。将所有数据框放在列表中并使用lapply循环遍历该列表可能是更好的方法(Tyler在他的回答中描述)。此外,如果这些是您拥有的更大的单一数据框的子集,那么更好的方法是使用plyr包中的某些内容来定义如何拆分大数据框和什么与每个部分有关。