在新变量名中使用值

时间:2015-06-10 22:00:45

标签: r

我正在尝试构建一个for循环,它将遍历每个站点,为该站点计算响应的频率,并将这些结果放入新的数据框中。然后在循环之后,我希望能够组合所有站点数据框,使其看起来像:

Site     Genus     Freq
1        A         50
1        B         30
1        C         20
2        A         70
2        B         10
2        C         20

但要做到这一点,我需要我的名字(矢量,数据帧)每次都要改变循环。我想我可以使用SiteNum变量来做到这一点,但是如何将它插入到新的变量名中呢?我尝试的方式(下面)将其视为字符串的一部分,不插入名称的值。

我觉得我想要使用的是占位符%,但我不知道如何使用变量名称来做到这一点。

> SiteNum <- 1
> for (Site in CoralSites){
    > Csub_SiteNum <- subset(dfrmC, Site==CoralSites[SiteNum]) 
    > CGrfreq_SiteNum <- numeric(length(CoralGenera))
    > for (Genus in CoralGenera){
        > CGrfreq_SiteNum[GenusNum] <- mean(dfrmC$Genus == CoralGenera[GenusNum])*100
        > GenusNum <- GenusNum + 1
        > }
    > names(CGrfreq_SiteNum) <- c(CoralGenera)
    > Site_SiteNum <- c(Site)
    > CG_SiteNum <- data.frame(CoralGenera,CGrfreq_SiteNum,Site_SiteNum)
    > SiteNum <- SiteNum + 1
    > }

1 个答案:

答案 0 :(得分:0)

您提出的问题询问如何创建一堆变量,例如: CGrfreq_1CGrfreq_2,...,其中变量的名称表示它对应的站点编号(1,2,...)。虽然你可以使用像assign这样的功能做这样的事情,但由于以下几个原因,这不是一个好习惯:

  1. 它使您的代码生成变量更复杂,因为它会被调用assignget以及paste0
  2. 这会使您的数据更难以操作 - 您需要(手动或以编程方式)识别特定类型的所有变量,使用getmget获取其值,然后用它们做点什么。
  3. 相反,您会发现使用其他将为您执行聚合的R函数更容易。在这种情况下,您希望为每个站点/ Genus生成配对站点中数据点的百分比与特定属值。这可以使用aggregate函数在几行代码中完成:

    # Sample data:
    (dat <- data.frame(Site=c(rep(1, 5), rep(2, 5)), Genus=c(rep("A", 3), rep("B", 6), "A")))
    #    Site Genus
    # 1     1     A
    # 2     1     A
    # 3     1     A
    # 4     1     B
    # 5     1     B
    # 6     2     B
    # 7     2     B
    # 8     2     B
    # 9     2     B
    # 10    2     A
    
    # Calculate frequencies
    dat$Freq <- 1
    res <- aggregate(Freq~Genus+Site, data=dat, sum)
    res$Freq <- 100 * res$Freq / table(dat$Site)[as.character(res$Site)]
    res
    #   Genus Site Freq
    # 1     A    1   60
    # 2     B    1   40
    # 3     A    2   20
    # 4     B    2   80