Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过循环响应变量(在列中)在R中创建汇总表和图表_R_Loops_Ggplot2 - Fatal编程技术网

如何通过循环响应变量(在列中)在R中创建汇总表和图表

如何通过循环响应变量(在列中)在R中创建汇总表和图表,r,loops,ggplot2,R,Loops,Ggplot2,我有一个包含多个响应变量和三种处理方法的数据集。治疗2嵌套在治疗1中,治疗3嵌套在治疗2中。为了简单起见,我只展示了三个响应变量。我想运行22个响应变量,其中3个显示在演示表中 我的目标: 可视化反应变量如何根据治疗组合变化。我已经创建了一个脚本来对一个响应变量执行此操作。我复制粘贴这段代码来运行其他列,这对我来说是一种非常粗糙的方法。这导致了我的第二个目标 自动化或修改以下脚本,使其能够自动循环通过列并生成所需的表和图形 演示数据: 这是我的剧本: library(doBy) length2

我有一个包含多个响应变量和三种处理方法的数据集。治疗2嵌套在治疗1中,治疗3嵌套在治疗2中。为了简单起见,我只展示了三个响应变量。我想运行22个响应变量,其中3个显示在演示表中

我的目标:

  • 可视化反应变量如何根据治疗组合变化。我已经创建了一个脚本来对一个响应变量执行此操作。我复制粘贴这段代码来运行其他列,这对我来说是一种非常粗糙的方法。这导致了我的第二个目标
  • 自动化或修改以下脚本,使其能够自动循环通过列并生成所需的表和图形
  • 演示数据:

    这是我的剧本:

    library(doBy)
    length2 <- function (x, na.rm=FALSE) {
        if (na.rm) sum(!is.na(x))
        else       length(x)
    }
     attach (demo)
    cdataNA <- summaryBy(tyr ~ spp + wat + ins, data=demo, FUN=c(length2,mean,sd), na.rm=TRUE)
    # Rename column change.length to just N
    names(cdataNA)[names(cdataNA)=="tyr.length2"] <- "N"
    # Calculate standard error of the mean
    cdataNA$tyr.SE <- cdataNA$tyr.sd / sqrt(cdataNA$N)
    cdataNA
    # Now create a barplot using ggplot2
    library(ggplot2)
    a <- ggplot(cdataNA, aes(x = wat, y = tyr.mean, fill = ins))
    b <- a + geom_bar(stat = "identity", position = "dodge") + facet_grid (~ spp)
    # Now put errorbars.
    c <- b + geom_errorbar(aes(ymin=tyr.mean-tyr.SE, ymax=tyr.mean+tyr.SE), 
                      width=.2,                    # Width of the error bars
                      position=position_dodge(.9)) + 
    xlab ("wat") + 
    ylab ("tyr (PA/PA std)")
    c
    
    ## esc
    library(doBy)
    length2 <- function (x, na.rm=FALSE) {
        if (na.rm) sum(!is.na(x))
        else       length(x)
    }
    cdataNA1 <- summaryBy(esc ~ spp + wat + ins, data=demo, FUN=c(length2,mean,sd), na.rm=TRUE)
    # Rename column change.length to just N
    names(cdataNA1)[names(cdataNA1)=="esc.length2"] <- "N"
    # Calculate standard error of the mean
    cdataNA1$esc.SE <- cdataNA1$esc.sd / sqrt(cdataNA1$N)
    cdataNA1
    # Now create a barplot using ggplot2
    library(ggplot2)
    a1 <- ggplot(cdataNA1, aes(x = wat, y = esc.mean, fill = ins))
    b1 <- a1 + geom_bar(stat = "identity", position = "dodge") + facet_grid (~ spp)
    # Now put errorbars.
    c1 <- b1 + geom_errorbar(aes(ymin=esc.mean-esc.SE, ymax=esc.mean+esc.SE), 
                      width=.2,                    # Width of the error bars
                      position=position_dodge(.9)) + 
    xlab ("wat") + 
    ylab ("esc (PA/PA std)")
    c1
    
    esc的结果图:

    因此,整个过程都是可行的,但仍然需要大量的体力劳动,这阻碍了工作流程。实现自动化会很好


    提前感谢。

    您可以将数据组织成两行:

    melt.dta <- melt(dta, id.vars = c("spp", "wat", "ins"), measure.vars = "tyr")
    cast(melt.dta, spp + wat + ins ~ ., 
         function (x) c("N" = sum(!is.na(x)), 
                        "mean" = mean(x, na.rm = TRUE),                   
                        "sd" = sd(x, na.rm = TRUE),
                        "se" = sd(x, na.rm = TRUE)/sqrt(sum(!is.na(x)))))
    

    融化你的数据,使不同的反应变量在一个额外的分类预测变量中处于不同的水平…@BenBolker:让我清楚地理解它。您是要我将3(或22)个响应变量的数据与预测变量(比如comp->containing tyr…、esc…、esc.R)融合到一列中吗?如果我这样做了,我的length2函数就不再有效了,不是吗?谢谢你的回复。你的剧本比我的干净多了。“tyr”起作用了。然而,当我执行
    myDta(dta,c(“spp”、“wat”、“ins”)、“esc”)
    时,我在
    [add.all.combines->中得到了
    错误[[
    
    melt.dta <- melt(dta, id.vars = c("spp", "wat", "ins"), measure.vars = "tyr")
    cast(melt.dta, spp + wat + ins ~ ., 
         function (x) c("N" = sum(!is.na(x)), 
                        "mean" = mean(x, na.rm = TRUE),                   
                        "sd" = sd(x, na.rm = TRUE),
                        "se" = sd(x, na.rm = TRUE)/sqrt(sum(!is.na(x)))))
    
      spp  wat ins N   mean      sd      se
    1  Bl High  No 4 0.3053 0.03410 0.01705
    2  Bl High Yes 5 0.1861 0.04517 0.02020
    3  Bl  Low  No 5 0.3105 0.06181 0.02764
    4  Bl  Low Yes 5 0.2028 0.02903 0.01298
    5 Man High  No 4 0.1227 0.07587 0.03793
    6 Man High Yes 5 0.0818 0.01346 0.00602
    7 Man  Low  No 5 0.0799 0.00957 0.00428
    8 Man  Low Yes 4 0.0835 0.01843 0.00922