【问题标题】:Selecting matching row values from a column (data frame) to create plots using a loop in R从列(数据框)中选择匹配的行值以使用 R 中的循环创建图
【发布时间】:2012-12-12 01:15:54
【问题描述】:

我有一组看起来像这样的数据,

species<-"ABC"
ind<-rep(1:4,each=24)
hour<-rep(seq(0,23,by=1),4)
depth<-runif(length(ind),1,50)

df<-data.frame(cbind(species,ind,hour,depth))
df$depth<-as.numeric(df$depth)

在这个例子中,列“ind”有更多的层级,它们的长度并不总是相同(这里每个人有 4 个层级,但实际上有些人有数千行数据,而其他人只有几行行)。

我想做的是有一个外部循环或函数,它将从每个人(“ind”)中选择所有行并使用深度/小时列生成箱线图。

这是我心中的想法,

for (i in 1:length(unique(df$ind))){

  data<-df[df$ind==df$ind[i],]
  individual[i]<-data

  plot.boxplot<-function(data){
  boxplot(depth~hour,dat=data,xlab="Hour of day",ylab="Depth (m)")

  }

}

par(mfrow=c(2,2),mar=c(5,4,3,1))
plot.boxplot(individual)

我意识到这个循环可能不合适,但我仍在学习。我可以一次为每个人绘制箱线图,但我想要一种更快、更有效的方式来为每个人选择数据并创建或存储箱线图结果。当我有更多人(而不是一次做一个......)时,这将非常有用。提前非常感谢。

【问题讨论】:

    标签: r function loops match boxplot


    【解决方案1】:

    这样的事情呢?

    par(mfrow=c(2,2))
    invisible(
      by(df,df$ind,
        function(x)
          boxplot(depth~hour,data=x,xlab="Hour of day",ylab="Depth (m)")
        )
    )
    

    为了提供一些解释,这将为df 定义的by df$ind 中的每组案例运行boxplotinvisible 包装器只是使用于boxplot 的输出束不会写入控制台。

    【讨论】:

    • 哇!非常感谢,这太棒了!一个快速的问题。如果我想包含每个人的姓名(例如,ind 1、ind 2 等)作为标题,最好的方法是什么。我尝试在 boxplot 函数中包含 main=paste(df$ind) 但没有给我一个标题...
    • @user1626688 - 尝试像这样替换上述函数内的箱线图线:boxplot(depth~hour,data=x,xlab="Hour of day",ylab="Depth (m)",main=paste("ind=",x$ind[1],sep="")),你应该很高兴。
    • 你觉得上面代码中使用by函数的时候可以选择两列吗?例如,不仅要选择每个人,还要选择一个匹配的列,让我们说这个人的特定季节,从而产生一个按 ind x 季节的深度与一天中小时的箱线图?
    • @user1626688 - 您可以在 by 函数内访问该组的任何变量 - 请在此处查看我的答案:stackoverflow.com/questions/13792951/analyze-by-row-groups-in-r/… 我相信这将是一个很好的指南。
    • 但一次只有一个变量?如果我想访问两个变量(个人和季节)的信息来获得结果,而不仅仅是个人或季节呢?我喜欢你的另一个例子,但我不确定它是否回答了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多