我正在尝试构建一个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
> }
答案 0 :(得分:0)
您提出的问题询问如何创建一堆变量,例如: CGrfreq_1
,CGrfreq_2
,...,其中变量的名称表示它对应的站点编号(1,2,...)。虽然你可以使用像assign
这样的功能做这样的事情,但由于以下几个原因,这不是一个好习惯:
assign
和get
以及paste0
。get
或mget
获取其值,然后用它们做点什么。相反,您会发现使用其他将为您执行聚合的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