【问题标题】:How to create a loop in R to iteratively plot elements of an array?如何在 R 中创建一个循环以迭代地绘制数组的元素?
【发布时间】:2011-06-09 09:39:14
【问题描述】:

我正在尝试创建一个循环以从先前创建的数组中提取数据,以便我可以使用提取的数据生成线图。

到目前为止,我一直在使用:

allweek1<-(data.frame(t_weekmean[,,1])) #which selects the date and generates the data frame I want to later format the date using
week1<-stack(allweek1) #and then plot it using
plot(week1$values,type="n", xlim=c(0,2),xlab="Weight (gr)",ylab="Rate (umol/L*gr)",main="All individuals and Treatments at all times")
lines(week1$values[week1$ind=="X9"]~x,type="o",col="red")
lines(week1$values[week1$ind=="X12"]~x,type="o",col="blue")
lines(week1$values[week1$ind=="X15"]~x,type="o",col="green")
lines(week1$values[week1$ind=="X18"]~x,type="o",col="purple").

我知道必须有一种方法可以将它变成一个循环,对于这个例子,我只给了两个星期,但我的数据会增加到 30,手动执行会很混乱,很容易出错。

这是我拥有的起始数组:

, , Week = 1

        Temp
variable       9      12      15      18
    X0   100.000 100.000 100.000 100.000
    X0.5  98.855  98.591  98.357  99.003
    X1    98.004  97.804  97.638  98.299
    X1.5  95.953  96.999  96.810  97.555
    X2    95.235  96.078  95.346  96.665

, , Week = 2

        Temp
variable       9      12      15      18
    X0   100.000 100.000 100.000 100.000
    X0.5  99.137  99.035  97.883  99.055
    X1    98.420  98.298  96.459  97.765
    X1.5  97.939  97.181  94.406  96.546
    X2    96.998  96.237  91.906  95.263

以下数据帧随后被转换为堆栈版本:

          X9     X12     X15     X18
X0   100.000 100.000 100.000 100.000
X0.5  98.855  98.591  98.357  99.003
X1    98.004  97.804  97.638  98.299
X1.5  95.953  96.999  96.810  97.555
X2    95.235  96.078  95.346  96.665

然后使用绘图代码。

【问题讨论】:

    标签: r loops


    【解决方案1】:

    听起来像是格子的任务:

    X <- as.data.frame(as.table(t_weekmean), stringsAsFactors=FALSE, responseName="values")
    X$variable <- as.numeric(gsub("^X","",X$variable))
    X$Temp <- as.numeric(X$Temp)
    
    require(lattice)
    xyplot(values~variable|Week, groups=Temp, X, type="o", as.table=TRUE,
        xlab="Weight (gr)", ylab="Rate (umol/L*gr)", main="All individuals and Treatments at all times"
    )
    

    我将您的数据重新创建为:

    t_weekmean <- structure(c(100, 98.855, 98.004, 95.953, 95.235, 100, 98.591, 97.804, 96.999, 96.078, 100, 98.357, 97.638, 96.81, 95.346, 100, 99.003, 98.299, 97.555, 96.665, 100, 99.137, 98.42, 97.939, 96.998, 
    100, 99.035, 98.298, 97.181, 96.237, 100, 97.883, 96.459, 94.406, 91.906, 100, 99.055, 97.765, 96.546, 95.263, 99.9889679441867, 
    98.8470416045204, 98.010997102523, 95.9636806506725, 95.235986063534, 100.00797414162, 98.5968712619705, 97.7984016535804, 96.9904933552904, 
    96.0816877686208, 99.9946318131395, 98.3568674165109, 97.6357767063124, 96.8119443900658, 95.3441814383421, 99.989633272252, 99.0037062049508, 
    98.3034580102509, 97.5568340624981, 96.6615796074679, 100.000379644977, 99.1375077671092, 98.4187321210541, 97.9350205929782, 97.0006243532971, 
    100.003971157774, 99.0316462150477, 98.298322594611, 97.1782003010139, 96.239865449585, 100.002464797458, 97.8810655647218, 96.4592857614756, 
    94.4099917372801, 91.9025173998885, 100.003642400375, 99.0529984607268, 97.76302246443, 96.5426428484451, 95.2658935513329),
    .Dim = c(5L, 4L, 4L), .Dimnames = structure(list(variable = c("X0", "X0.5", "X1", "X1.5", "X2"),
    Temp = c("9", "12", "15", "18"), Week = c("1", "2", "3", "4")), .Names = c("variable", "Temp", "Week"))
    )
    

    【讨论】:

      【解决方案2】:

      如果你使用plyr,你可以使用a_ply

      a_ply(t_weekmean, 3, function(arrayforcurweek){
      allweek1<-(data.frame(arrayforcurweek)) #which selects the date and generates the data frame I want to later format the date using
      week1<-stack(allweek1) #and then plot it using
      plot(week1$values,type="n", xlim=c(0,2),xlab="Weight (gr)",ylab="Rate (umol/L*gr)",main="All individuals and Treatments at all times")
      lines(week1$values[week1$ind=="X9"]~x,type="o",col="red")
      lines(week1$values[week1$ind=="X12"]~x,type="o",col="blue")
      lines(week1$values[week1$ind=="X15"]~x,type="o",col="green")
      lines(week1$values[week1$ind=="X18"]~x,type="o",col="purple")
      })
      

      就像这样,您只会看到最后一张图,因为其余部分通常会被覆盖。所以你可能想要添加一个布局语句,或者在图表之间提供一个暂停等。

      好的,根据您的评论提供更多信息:

      a_ply 在这里接受 3 个参数:首先是执行操作的数组,其次是“边距”,意思是:我应该在哪个维度上迭代(这是“隐藏”循环),最后是一个函数执行所有部分。

      那么会发生什么:a_ply 获取数组第三维的所有可能值(因为 margin==3),并在它们之上运行(您可以将其视为 for 循环中的索引器 i)。然后它为每个这些值获取数组的一部分(有点像t_weekmean[,,i]),并将其提供给作为第三个参数的函数(因此在这个函数中,连续的边缘数组将被称为arrayforcurweek)。

      这种工作方式的问题在于,图形是连续快速生成的,因此如果您只是运行此代码并查看图像窗口,您应该只能看到第三维最后一个值的图形。如果您想看到所有这些都彼此相邻(尽管这会导致小图),您可以在其前面加上以下内容: 布局(矩阵(1:30),nrow=6) 这将导致屏幕被分成 30 个屏幕,以便每个绘图都有自己的全屏部分。

      我相信,如果您立即写到 pdf 或类似文件,您不需要这个,但我没有这方面的经验。

      这对你有帮助吗?

      【讨论】:

      • 非常好!!!我将添加一个 par(mfrow=c(2,2)) 以便每个图表有 4 周的集合,并了解如何保存它们。谢谢!!!
      猜你喜欢
      • 2015-04-04
      • 2021-01-23
      • 2022-11-22
      • 2011-01-02
      • 2016-09-04
      • 2019-04-07
      • 2015-02-24
      • 2020-08-31
      • 1970-01-01
      相关资源
      最近更新 更多