【发布时间】:2013-12-16 11:51:15
【问题描述】:
我在数据帧中保存循环的输出时遇到了一些麻烦。由于我的脚本太复杂,无法在这个问题中解释,这里是我的代码的简化版本:
编辑
df<-data.frame(matrix(NA, nrow = 100, ncol = 9)) #empty dataframe set for 100 max rows
df<-c("YEAR","RN","DATE","NOM","SITE","LONG","SP","SUMNB","NB100" )
do.call(rbind, by(DF, DF[c("YEAR","SITE")], FUN = function(x) {
df<-dataframe filling code
})
所以基本上它是通过 VAR1 和 VAR2 对我的 DF 进行子集化,并为每个子集构建一个新的 df。如何构建一个新的数据框(TOT),将我的所有“df”放在彼此之上?
注意:我不知道每个“df”将有多少行,这就是为什么我设置最大 100 行,然后立即删除 NA 行。但是 DF 和 df 具有相同的列。
感谢您的帮助!
编辑:
我的意思是对每个 YEAR/SITE 组合进行子集化,对其应用一个函数(基于每个子集构建一个具有更改日期的虚拟数据 df,其格式与输入 DF 相同),并以与输入 DF 相同的格式返回函数输出数据框。通过堆叠我为每个子集获得的所有 df 构建的这个数据框将具有与我的输入 DF 完全相同的格式。我需要更多应用程序将我的输入与该输出合并。
do.call(rbind) 的用途是完成工作(子集)并应用函数(创建 df)。此时,由于某种原因(似乎未应用该功能),我无法使 ddply 工作,并且我认为它不适合我的要求:ddply 将该功能应用于输入并返回修改后的输入。我的输入没有被修改,我想返回另一个数据框。
似乎我无法将找到的任何答案应用于我的函数,因为我不知道输出应该包含的行数。
编辑 2:
由于我的问题似乎已经完全被理解,这是我的全部问题:
我的输入数据框 (AGG100) 的前 15 行:
YEAR RN DATE NOM SITE LONG SP SUMNB NB100
1 2011 RNN027 15056 ESTAGNOL RNN027-Estagnol 02 310 Anthocharis cardamines (Linnaeus, 1758) 1 0.3225806
2 2011 RNN027 15075 ESTAGNOL RNN027-Estagnol 02 310 Anthocharis cardamines (Linnaeus, 1758) 1 0.3225806
3 2003 RNN027 12166 ESTAGNOL RNN027-Estagnol 03 330 Anthocharis cardamines (Linnaeus, 1758) 2 0.6060606
4 2006 RNN027 13252 ESTAGNOL RNN027-Estagnol 03 330 Anthocharis cardamines (Linnaeus, 1758) 2 0.6060606
5 2006 RNN027 13257 ESTAGNOL RNN027-Estagnol 03 330 Anthocharis cardamines (Linnaeus, 1758) 2 0.6060606
6 2005 RNN027 12895 ESTAGNOL RNN027-Estagnol 01 540 Anthocharis cardamines (Linnaeus, 1758) 2 0.3703704
7 2005 RNN027 12910 ESTAGNOL RNN027-Estagnol 01 540 Anthocharis cardamines (Linnaeus, 1758) 2 0.3703704
8 2011 RNN027 15075 ESTAGNOL RNN027-Estagnol 01 540 Anthocharis cardamines (Linnaeus, 1758) 1 0.1851852
9 2008 RNN027 14120 ESTAGNOL RNN027-Estagnol 05 960 Anthocharis cardamines (Linnaeus, 1758) 2 0.2083333
10 2011 RNN027 15065 ESTAGNOL RNN027-Estagnol 05 960 Anthocharis cardamines (Linnaeus, 1758) 1 0.1041667
11 2011 RNN027 15075 ESTAGNOL RNN027-Estagnol 05 960 Anthocharis cardamines (Linnaeus, 1758) 1 0.1041667
12 2007 RNN027 13679 ESTAGNOL RNN027-Estagnol 05 960 Apatura ilia (Denis & Schifferm�ller, 1775) 2 0.2083333
13 2004 RNN027 12573 ESTAGNOL RNN027-Estagnol 06 260 Aporia crataegi (Linnaeus, 1758) 2 0.7692308
14 2005 RNN027 12917 ESTAGNOL RNN027-Estagnol 06 260 Aporia crataegi (Linnaeus, 1758) 2 0.7692308
15 2006 RNN027 13301 ESTAGNOL RNN027-Estagnol 06 260 Aporia crataegi (Linnaeus, 1758) 2 0.7692308
此数据框填充了 9 年时在不同地点(ESTAGNOL 01 至 06)中的物种(本例中为 66 个)观察结果。
这是我的完整代码:
MIN<-data.frame(matrix(NA, nrow = 100, ncol = 9)) #reglé pour 100 lignes max
colnames(MIN)<-c("YEAR","RN","DATE","NOM","SITE","LONG","SP","SUMNB","NB100" )
MAX<-data.frame(matrix(NA, nrow = 100, ncol = 9))
colnames(MAX)<-c("YEAR","RN","DATE","NOM","SITE","LONG","SP","SUMNB","NB100" )
do.call(rbind, by(AGG100, AGG100[c("YEAR","SITE")], FUN = function(x) {
splist<-unique(x$SP)
lsp<-length(splist)
for (i in 1:lsp){
MIN$SP[i]<-as.character(splist[i])
MIN$SITE[i]<-as.character(unique(x$SITE))
MIN$DATE[i]<-as.character(min(x$DATE) - 7)
MIN$RN[i]<-as.character(unique(x$RN))
MIN$YEAR[i]<-as.character(unique(x$YEAR))
MIN$NOM[i]<-as.character(unique(x$NOM))
MIN$LONG[i]<-as.numeric(unique(x$LONG))
MIN$SUMNB[i]<-0
MIN$NB100[i]<-0
MAX$SP[i]<-as.character(splist[i])
MAX$SITE[i]<-as.character(unique(x$SITE))
MAX$DATE[i]<-as.character(min(x$DATE) + 7)
MAX$RN[i]<-as.character(unique(x$RN))
MAX$YEAR[i]<-as.character(unique(x$YEAR))
MAX$LONG[i]<-as.numeric(unique(x$LONG))
MAX$SUMNB[i]<-0
MAX$NB100[i]<-0
MINMAX<- rbind(MIN,MAX)
MINMAX<-MINMAX[complete.cases(MINMAX),]
}
return(MINMAX)
}))
我能做什么:
-每个 YEAR/SITE 组合的子集,以隔离所有物种总和的第一个和最后一个观察日期(时间范围的限制)。使用 do.call(rbind) 或 ddply() 完成。
-创建一行,其中填充了 AGG100 的所有相应数据(每 9 列),观测值为零,并且每个物种的第一次观测前 7 天的日期(66 行)。编译名为 MIN 的 df 中的行。 - 在最后一次观察后 7 天创建另一行(66 行)。在名为 MAX 的 df 中编译这些行 - 根据每个子集 i 的物种数量,使用 for 循环创建两种行类型。
-将 MIN 和 MAX 合并到一个新的数据帧 (MINMAX) 中,该数据帧的格式与我的输入数据帧相同。
我需要做什么:
-能够为每个子集返回 MINMAX。我目前只有最后一次迭代(去年和最后一个站点)。用这些 MINMAX (MINMAXTOT) 构建一个数据框。
-将 MINMAXTOT 与 AGG100 合并,并按日期对结果进行排序。
我希望它现在已经足够清楚了。我只想在我的脚本中添加一行,不会在每次迭代时覆盖输出。
编辑 3:
summary(AGG100)
YEAR RN DATE NOM
2009 : 775 RNN027 :5360 Min. :2003-04-17 ESTAGNOL :5360
2003 : 717 RNN037 : 0 1st Qu.:2005-05-27 ANCIENNES CARRIERES D'ORIVAL: 0
2006 : 689 RNN044 : 0 Median :2007-07-13 BAIE DE L'AIGUILLON (VENDEE): 0
2008 : 598 RNN046 : 0 Mean :2007-06-17 CHERINE : 0
2011 : 557 RNN060 : 0 3rd Qu.:2009-07-16 COMBE LAVAUX-JEAN ROLAND : 0
2004 : 524 RNN066 : 0 Max. :2011-10-06 COTE DE MANCY : 0
(Other):1500 (Other): 0 (Other) : 0
SITE LONG SP SUMNB
RNN027-Estagnol 01:1135 Min. :260.0 Pieris PC (rapae / mannii) #complexe : 651 Min. : 1.000
RNN027-Estagnol 05: 957 1st Qu.:310.0 Polyommatus icarus (Rottemburg, 1775): 482 1st Qu.: 2.000
RNN027-Estagnol 04: 951 Median :540.0 Maniola jurtina (Linnaeus, 1758) : 456 Median : 2.000
RNN027-Estagnol 03: 915 Mean :543.5 Brintesia circe (Fabricius, 1775) : 446 Mean : 6.215
RNN027-Estagnol 02: 801 3rd Qu.:710.0 Lasiommata megera (Linnaeus, 1767) : 341 3rd Qu.: 6.000
RNN027-Estagnol 06: 601 Max. :960.0 Pieris brassicae (Linnaeus, 1758) : 313 Max. :156.000
(Other) : 0 (Other) :2671
NB100
Min. : 0.1042
1st Qu.: 0.3226
Median : 0.6452
Mean : 1.2876
3rd Qu.: 1.2903
Max. :28.8889
【问题讨论】:
-
目前,您的示例无法重现(
df没有名为VAR1和SVAR2的列),因此很难理解您想要什么。不是按这些变量拆分然后调用do.call(rbind)与按这些变量排序一样吗?当您考虑自己想要什么时,我将采用标准建议:查看plyr包中的ddply。 -
通常,当我给出完整代码时,讨论的重点是我不想讨论的部分(这里是数据帧填充代码,主要是因为它是一个for循环)。我自愿不显示它,因为我只是想知道一种方法来自动将我的函数中获得的数据帧连接到全局数据帧中。我确实提到我的输入 DF 和输出 df 具有相同的变量(我只是跳过了我命名 df 的九列的行)。但是我更新了我的帖子。
-
问题是您的所有代码似乎都在拆分一个 df,然后将其重新绑定在一起,因此很难看出您要做什么。
-
这就是为什么我认为我无法做出任何我发现有效的答案:我拆分我的 DF 以将一个函数应用于每个子集,但我不想修改我的输入 DF。我寻求的数据帧输出与我的输入数据帧无关。
-
看起来您正在尝试按物种以及地点和年份计算值,因此也按物种进行拆分。
by(AGG100, AGG100[c("YEAR","SITE", "SP")]
标签: r