在保存数据帧中循环的输出时遇到一些问题。由于我的脚本太复杂而无法在此问题中进行解释,因此这是我的代码的简化版本:
编辑
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完全相同的格式。我需要进一步的应用程序来合并我的输入和输出。
使用do.call(rbind)正在完成工作(子集)并应用函数(创建df)。在这一点上,我不能让ddply工作由于某种原因(似乎函数没有应用),我认为它不适合我的请求:ddply将函数应用于输入并返回修改后的输入。我的输入未被修改,我想返回另一个数据帧。
似乎我无法应用我在函数中找到的任何答案,因为我不知道输出应该有多少行。
编辑2:
由于我的问题似乎已得到充分发展,所以这是我的完整问题:
输入数据帧的前15行(AGG100):
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()完成。
在每个物种(66行)的第一次观察前7天,用零观察和日期填充一行填充AGG100的所有相应数据(每9列)。编译名为MIN的df中的行。 - 在最后一次观察后七天创建另一行日期(66行)。在名为MAX的df中编译这些行 - 使用for循环创建的两个行类型,基于每个子集的物种数量。
- 新数据帧(MINMAX)中的MIN和MAX,其格式与输入数据帧相同。
我需要做什么:
- 能够为每个子集返回MINMAX。我目前只进行了最后一次迭代(去年和最后一次)。使用这些MINMAX(MINMAXTOT)构建数据帧。
-Merge MINMAXTOT with 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
答案 0 :(得分:0)
可重现的数据集:
n <- 50
DF <- data.frame(
VAR1 = sample(letters[1:3], n, replace = TRUE),
VAR2 = sample(LETTERS[1:5], n, replace = TRUE)
Y = runif(n)
)
计算按VAR1
和VAR2
划分的统计信息的示例。
library(plyr)
ddply(
DF,
.(VAR1, VAR2),
summarise,
MeanOfY = mean(Y),
SumOfY = sum(Y)
)
为了将来参考,请尝试搜索短语“split apply combine”。
更新
问题的最新描述仍然不是很清楚,但似乎你只想添加作为年份和网站功能的新变量。您无需进行任何子集化或重组。
这是您的数据集:
n <- 50
DF <- data.frame(
YEAR = sample(2000:2013, n, replace = TRUE),
SITE = sample(LETTERS[1:5], n, replace = TRUE)
#some other variables
)
这是年份和网站的虚拟功能。将其更改为您需要的任何内容。
do_something <- function(year, site)
{
ifelse(
year < 2005,
ifelse(
site %in% c("A", "C", "E"),
1,
2
),
3
)
}
这是添加新变量的一种方法:
DF$NewVar <- with(DF, do_something(YEAR, SITE))