2013-12-16 3 views
0

У меня есть некоторые проблемы с сохранением выходов цикла в кадре данных. Как мой сценарий слишком сложен, чтобы объяснить в этом вопросе, вот это упрощенная версия моего кода: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 
+4

На данный момент, ваш пример не воспроизводим ('df' не имеют столбцов с именем' 'VAR1' и SVAR2'), поэтому его трудно понять, чего вы хотите. Не разделяется этими переменными, а затем вызывает 'do.call (rbind)' точно так же, как сортировка по этим переменным? Пока вы думаете о том, чего хотите, я прибегаю к стандартному совету: посмотрите на 'ddply' в пакете' plyr'. –

+0

Обычно, когда я даю полный код, обсуждение фокусируется на части, которую я не хочу обсуждать (здесь код заполнения данных данных, в основном потому, что его цикл for). Я добровольно не показываю его, потому что просто хочу знать способ автоматического объединения данных, полученных в моей функции, в глобальном фреймворке данных. Я упомянул, что мой входной DF и вывод df имеют одинаковые переменные (я просто пропустил строку, где я называет девять столбцов df). Однако я обновил свой пост. – user2542995

+0

Проблема в том, что весь ваш код, похоже, разделяет df, а затем соединяет его вместе, поэтому его трудно понять, что вы пытаетесь сделать. – Thomas

ответ

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 comb».


Update:

Последняя описание проблемы до сих пор не очень понятно, но кажется, что вы просто хотите добавить новые переменные, которые являются функциями года и сайта. Вам не нужно делать какие-либо подмножества или рекомбинировать вещи.

Вот ваш набор данных:

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)) 
+0

Я не пытаюсь подсчитывать что-либо с моим вводом. Компонент «split apply» может быть моим решением, только если я могу запустить цикл в части приложения. Кажется, что коммандная часть не работает, потому что я делаю часть с разделом неправильно. – user2542995

+0

См. мое обновленное сообщение. – user2542995

Смежные вопросы