2016-02-26 94 views
0

我正在處理一個捕魚船隊的大型數據集,我需要將其格式化爲泊松迴歸和其他計數模型。請參閱下面的數據子集。 count變量是'days'。 p1:p3是端口組的指示變量,f1:f4是其他捕魚活動的指示變量。操作數據表進行泊松迴歸:添加零行和滯後變量

yr week id days rev p1 p2 p3 f1 f2 f3 f4 
2016 3 1 1 5568.3 0 1 0 0 0 0 0 
2016 4 1 3 8869.53 0 1 0 0 0 0 0 
2016 5 1 2 12025.8 0 1 0 0 0 0 0 
2016 6 1 2 9126.6 0 1 0 0 0 0 0 
2016 7 1 3 4415.4 0 1 0 0 0 0 0 
2016 8 1 2 11586.6 0 1 0 0 0 0 0 
2016 10 1 1 2144.4 0 1 0 0 0 0 0 
2016 11 1 1 2183.25 0 1 0 0 0 0 0 
2016 14 1 2 4998 0 1 0 0 0 0 0 
2016 15 1 3 117  0 1 0 0 0 0 0 
2016 1 2 4 12743.3 0 0 1 1 1 0 0 
2016 2 2 2 7473.48 0 0 1 1 0 0 0 
2016 5 2 2 8885.52 0 0 1 1 0 0 0 
2016 7 2 1 15330.6 0 0 1 1 1 0 0 
2016 8 2 2 3763.8 0 0 1 1 1 0 0 
2016 9 2 1 2274.05 0 0 1 1 1 0 0 

這些行只代表活動周,但我需要合併每艘船的非活動周。例如,對於id = 1,在year(yr)2016中,我需要添加從第1周開始的行,然後是第9,12和13周的行。這些行需要在虛擬機中保留相同的信息類別(這些不會按年份更改),並且在「日期」列中有零。我不需要在當年和船隻的「星期」的最後一個值之後添加行。

這是事情變得很複雜:

在收入(REV)列這些新創建的行我需要添加該周和年平均收入共享同一端口組的所有船隻( P1:P3)。

最後,我需要添加一個新的滯後收入專欄。對於每一行,滯後收入的價值應該是該年該船在前一週的「轉期」欄中的值。

每艘船的第1周的價值應該是該船在該年的前2周收入的平均值。

這個任務將我的數據處理技能吹向了smithereens,並將我的頭撞向牆壁開始受傷。任何建議,將不勝感激!謝謝。

+0

從這裏開始,讓我們知道有多遠,讓你:http://stackoverflow.com/questions/22462405/add-missing-rows-to-a-data-table – MichaelChirico

+0

感謝您的鏈接。我在過去的幾個小時裏一直在想這個,看起來CJ可能不是我所需要的?我不是想爲每週的每個可能值添加行,而是缺少每週(最多爲每個id和季節的最大值)的周(從周= 1開始)的值。 – user1754348

+0

我可能已經想到了一種以excel和access的組合來攻擊的方法,但我真的試圖擺脫那些熟悉的後備方式。無論如何,如果我找到解決方案,我會報告回去...... – user1754348

回答

0

感謝https://stackoverflow.com/users/3001626/david-arenburghttps://stackoverflow.com/users/2802241/user2802241,問題已解決。你可以看到一個帖子上添加行部分: Adding rows to a data.table according to column values

test<-data.frame(DT %>% 
    group_by(yr, id) %>% 
    complete(week = 1:max(week)) %>% 
    replace_na(list(days = 0)) %>% 
    group_by(yr, id) %>% 
    mutate_each(funs(replace(., is.na(.), mean(., na.rm = T))), p1:f4)) 

    poisson<-data.table(test) 
    setkey(poisson,yr,id,week) 

    avrev<-poisson[,.(avrev = mean(rev,na.rm=T)),by=.(p1,p2,[p3,week,yr)] 
    avrev<-transform(avrev,xyz=interaction(p1,p2,p3,week,yr,sep='')) 
    poisson<-transform(poisson,xyz=interaction(tier200,tier300,tier500,week,yr,sep='')) 
    poisson<-transform(poisson,uniqueid=interaction(drvid,season,sep='')) 

    poisson$rev[is.na(poisson$rev)]<- avrev$avrev[match(poisson$xyz[is.na(poisson$rev)],avrev$xyz)] 

    poisson[, lagrev:=c(rev[1], rev[-.N]), by=uniqueid] 

我敢肯定有一個更漂亮和整潔完成任務的方式,但這個工程。 David Arenburg還在評論部分發布了一個答案,該部分利用data.table創建新行 - 請參閱其他帖子。

0

要獲取周,年,P1,P2和P3的平均收入只是使用聚合函數:

average_rev <- aggregate(rev~week+year+p1+p2+p3, data=your_dataframe, FUN=mean)

要添加滯後收入的新列:

your_dataframe$lagged_rev <- c(NA, your_dataframe$rev[1:(nrow(_your_dataframe)-1)])

要獲得平均爲轉過去兩週:

your_dataframe$avg_rev <- rowMeans(your_dataframe[,c('rev','lagged_rev')])

+0

謝謝,但這不是我正在尋找的。第一部分的工作是計算平均收入,但我試圖進行的第一個任務是添加新行以填充平均收入。 – user1754348

+0

收入落後的方法並不奏效,因爲當我到達「年」的末尾時,下一年的第一個價值只是上一年的最後一個價值,而這並非我所需要的。數據不平衡! – user1754348

+0

對於滯後的值,可以將所有年份的數據拆分,以便每年有多個數據集,然後執行滯後分析。這樣,當你進行滯後分析時,你不會得到前幾年的收入。 –