2017-02-15 63 views
0

我需要使用R計算一些中間計算。 以下是有關某些事件及其類型在某些年份的數據。使用R中的子集計算數據框中當前行的值

structure(list(year = c(1994, 1995, 1997, 1997, 1998, 1998, 1998, 
2000, 2000, 2001, 2001, 2002), N = c(3L, 1L, 1L, 4L, 1L, 1L, 
4L, 1L, 2L, 1L, 5L, 1L), type = c("OIL", "LNG", "AGS", "OIL", 
"DOCK", "LNG", "OIL", "LNG", "OIL", "LNG", "OIL", "DOCK")), .Names =  c("year", 
"N", "type"), row.names = c(NA, 12L), class = "data.frame") 


> head(mydf3) 
    year N type 
1 1994 3 OIL 
2 1995 1 LNG 
3 1997 1 AGS 
4 1997 4 OIL 
5 1998 1 DOCK 
6 1998 1 LNG 

我需要得到有關年份和類型今年的N個累加之和,總累積和和年累計總和數據,直到當前所有類型。

,所以我需要獲取信息這樣

year type cntyear cnt_cumultype cnt_cumulalltypes 
1994 OIL 3 3 3 
1994 LNG 0 0 3 
1994 AGS 0 0 3 
1994 DOCK 0 0 3 
1995 OIL 0 3 4 
1995 LNG 1 1 4 
1995 AGS 0 0 4 
1995 DOCK 0 0 4 
... 

一些解釋:

  1. cntyear - 此爲N算上本年度和類型。
  2. cnt_cumultype - 這是此類型的累計總和,直到當年。
  3. cnt_cumulalltypes - 這是所有 年的所有類型的累計總和,包括當前的< =當前年份。

只想做這樣的事情,但它沒有正確的工作...

mydf3$cnt_cumultype<-tail(cumsum(mydf3[which(mydf3$type==mydf3$type & mydf3$year==mydf3$year),]$N), n=1) 

如何按行計算這個數字?

+1

請花一些時間來解釋你的三個新變量的計算。你想要的輸出不足以區分它們(至少對我來說)。 – lmo

+0

完成後,添加一些解釋 – twistfire

+0

那麼,在你想要的輸出中,cnt_cumultype不應該是1995年的油? – lmo

回答

0

這是一個使用data.table包的解決方案。這也可以在R基礎上求解,但是特別的一個步驟可以縮短爲data.table

# load library 
library(data.table) 
# caste df as a data.table and change column order 
setcolorder(setDT(df), c("year", "type", "N")) 
# change column names 
setnames(df, names(df), c("year", "type", "cntyear")) 

# get all type-year combinations in data.table with `CJ` and join these to original 
# then, in second [, replace all observations with missing counts to 0 
df2 <- df[CJ("year"=unique(df$year), "type"=unique(df$type)), on=c("year", "type") 
      ][is.na(cntyear), cntyear := 0] 
# get cumulative counts for each type 
df2[, cnt_cumultype := cumsum(cntyear), by=type] 
# get total counts for each year 
df2[, cnt_cumulalltypes := cumsum(cntyear)] 

這導致

df2 
    year type cntyear cnt_cumultype cnt_cumulalltypes 
1: 1994 AGS  0    0     0 
2: 1994 DOCK  0    0     0 
3: 1994 LNG  0    0     0 
4: 1994 OIL  3    3     3 
5: 1995 AGS  0    0     3 
6: 1995 DOCK  0    0     3 
7: 1995 LNG  1    1     4 
8: 1995 OIL  0    3     4 
9: 1997 AGS  1    1     5 
    .... 
+0

謝謝,我會盡力的。還有一個問題,如何計算cnt_cumulalltypes - 它必須計算所有年份,直到當前。例如對於1995年 - 必須計算所有年份的總和<= 1995年。 – twistfire

相關問題