У меня есть некоторые проблемы с сохранением выходов цикла в кадре данных. Как мой сценарий слишком сложен, чтобы объяснить в этом вопросе, вот это упрощенная версия моего кода:R укладка вывода из цикла
отредактировал
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
})
Так в основном это Подменит мой DF по VAR1 и var2, и строительству нового df для каждого подмножества. Как я могу построить новую фреймворк данных (TOT) со всеми моими «df» в верхней части друг друга?
Примечания: Я не знаю, сколько строк будет иметь каждый «df», поэтому я устанавливаю 100 строк max, а затем удаляю строки NA сразу после. Но DF и df имеют одинаковые столбцы.
Спасибо за помощь!
EDIT:
Моя точка является подмножество каждую комбинацию YEAR/SITE, применить функцию к нему (построение ФР фиктивных данных с измененными датами на основе каждого подмножества, в том же формате, чем на входе DF) и вернуть выход функции в кадре данных. Этот dataframe, созданный путем укладки всех df, полученных для каждого подмножества, будет иметь тот же формат, что и мой входной DF. Мне нужны дальнейшие приложения для объединения моего ввода с этим выходом.
Использование do.call (rbind) выполняет задание (подмножество) и применяет функцию (создание df). На данный момент я не могу заставить ddply работать по какой-то причине (кажется, что функция не применяется), и я не думаю, что это подойдет моему запросу: ddply применяет функцию к входу и возвращает измененный ввод. Мой вход не изменен, и я хочу вернуть другой фрейм данных.
Кажется, я не могу применить любые ответы, которые я нашел для своей функции, потому что я не знаю, сколько строк должно иметь выход.
EDIT 2:
Как кажется, мой вопрос будет полностью разработана, чтобы быть понятым, вот моя полная задача:
первые 15 строк моего входного dataframe (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
Этот блок данных заполнен видами (66 в этом примере) наблюдениями в разных местах (ESTAGNOL 01 до 06) через 9 лет.
вот мой полный код:
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 столбцов) с нулевым наблюдением и датой за семь дней до первого наблюдения для каждого вида (66 строк). Скомпилируйте строки в df с именем MIN. -создайте еще один ряд с датой через семь дней после последнего наблюдения (66 строк). Скомпилируйте эти строки в df, называемом MAX . Тип строк, созданный с помощью цикла for, основанный на числе видов i в каждом подмножестве.
-Merge MIN и MAX в новом кадре данных (MINMAX), который имеет тот же формат, что и мой входной кадр данных.
Что мне нужно сделать:
-be смог вернуться MinMax для каждого подмножества. В настоящее время я получил последнюю итерацию (последний YEAR и последний САЙТ). Создайте DataFrame из этих MINMAX (MINMAXTOT).
-Merge 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)' точно так же, как сортировка по этим переменным? Пока вы думаете о том, чего хотите, я прибегаю к стандартному совету: посмотрите на 'ddply' в пакете' plyr'. –
Обычно, когда я даю полный код, обсуждение фокусируется на части, которую я не хочу обсуждать (здесь код заполнения данных данных, в основном потому, что его цикл for). Я добровольно не показываю его, потому что просто хочу знать способ автоматического объединения данных, полученных в моей функции, в глобальном фреймворке данных. Я упомянул, что мой входной DF и вывод df имеют одинаковые переменные (я просто пропустил строку, где я называет девять столбцов df). Однако я обновил свой пост. – user2542995
Проблема в том, что весь ваш код, похоже, разделяет df, а затем соединяет его вместе, поэтому его трудно понять, что вы пытаетесь сделать. – Thomas