【问题标题】:How to loop through data sets to graph particular columns only?如何遍历数据集以仅绘制特定列?
【发布时间】:2012-04-11 21:38:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: r loops ggplot2 dataframe


    【解决方案1】:

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

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

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

    【讨论】:

    • 布莱恩,谢谢你!这正是我一直在寻找的,但没有意识到我的理解和可用功能的缺点。我是一个正在恢复的 SAS 用户,在我们的新实现迁移到 R 方面取得了进展。所以,看起来我无法以这种方式做我想做的事情——由于某种原因,ggplot 没有在循环中触发。我将深入研究 plyr,看看是否可以完成工作。
    • @BenH - 你确定你print() ggplot 对象吗?在函数中使用时,ggplot 和 lattice 对象都必须打印...我 99% 确定这是某个地方的常见问题解答,也许有人会为我们回忆。
    • 你是对的,蔡斯。一定忽略了常见问题的那部分。
    【解决方案2】:

    您的代码不可重现,因此这是我对您想要的最佳猜测:

    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 的做事方式。

    【讨论】:

    • 我很好奇为什么它不是“可重现的”——我唯一改变的是数据框名称并且包含的​​数据更少。其他一切都是为我运行的代码——当然,减去循环。
    • 是的,我知道出了什么问题。我认为是太少的数据给了我一个错误,这是你的数据末尾有一个小刻度线,当我剪切和粘贴时几乎不显示,但会导致错误被抛出。这就是为什么我将你的一堆数据集粘贴在一起,但这不是必需的。
    • PS 我知道你想使用循环,但我真的建议你熟悉 apply 系列函数。
    • 所以,勾号是试图让我的东西在这里正确显示的人工制品。我正在尝试学习 R,但我也在尝试以对我有意义的方式完成工作。我将开始深入研究 apply 系列。
    猜你喜欢
    • 2019-01-15
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2019-11-24
    • 2022-07-26
    • 1970-01-01
    • 2019-12-15
    • 2018-09-04
    相关资源
    最近更新 更多