このようなデータフレームがあり、行 VALUE の累積合計を計算しようとしています。入力ファイルは、https ://dl.dropboxusercontent.com/u/16277659/input.csv にもあります。
df <-read.csv("input.csv", sep=";", header=TRUE)
NAME; ID; SURVEY_YEAR REFERENCE_YEAR; VALUE
SAMPLE1; 253; 1880; 1879; 14
SAMPLE1; 253; 1881; 1880; -10
SAMPLE1; 253; 1882; 1881; 4
SAMPLE1; 253; 1883; 1882; 10
SAMPLE1; 253; 1884; 1883; 10
SAMPLE1; 253; 1885; 1884; 12
SAMPLE1; 253; 1889; 1888; 11
SAMPLE1; 253; 1890; 1889; 12
SAMPLE1; 253; 1911; 1910; -16
SAMPLE1; 253; 1913; 1911; -11
SAMPLE1; 253; 1914; 1913; -8
SAMPLE2; 261; 1992; 1991; -19
SAMPLE2; 261; 1994; 1992; -58
SAMPLE2; 261; 1995; 1994; -40
SAMPLE2; 261; 1996; 1995; -21
SAMPLE2; 261; 1997; 1996; -50
SAMPLE2; 261; 1998; 1997; -60
SAMPLE2; 261; 2005; 2004; -34
SAMPLE2; 261; 2006; 2005; -23
SAMPLE2; 261; 2007; 2006; -19
SAMPLE2; 261; 2008; 2007; -29
SAMPLE2; 261; 2009; 2008; -89
SAMPLE2; 261; 2013; 2009; -14
SAMPLE2; 261; 2014; 2013; -16
私が目指している最終製品は、各サンプルのプロットです。x 軸には SURVEY_YEAR がプロットされ、y 軸には後で計算された VALUE の累積合計 CUMSUM がプロットされます。データを整理するためのこれまでの私のコード:
# Filter out all values with less than 3 measurements by group (in this case does nothing, but is important with the rest of my data)
df <-read.csv("input.csv", sep=";", header=TRUE)
rowsn <- with(df,by(VALUE,ID,function(xx)sum(!is.na(xx))))
names(which(rowsn>=3))
dat <- df[df$ID %in% names(which(rowsn>=3)),]
# write new column which defines the beginning of the group (split by ID) and for the cumsum function(=0)
dat <- do.call(rbind, lapply(split(dat, dat$ID), function(x){
x <- rbind(x[1,],x); x[1, "VALUE"] <- 0; x[1, "SURVEY_YEAR"] <- x[1, "SURVEY_YEAR"] -1; return(x)}))
rownames(dat) <- seq_len(nrow(dat))
# write dat to csv file for inspection
write.table(dat, "dat.csv", sep=";", row.names=FALSE)
これにより、行 VALUE の累積合計の計算の開始点である次のデータフレームが生成されます。
NAME; ID; SURVEY_YEAR; REFERENCE_YEAR; VALUE
SAMPLE1; 253; 1879; 1879; 0
SAMPLE1; 253; 1880; 1879; 14
SAMPLE1; 253; 1881; 1880; -10
SAMPLE1; 253; 1882; 1881; 4
SAMPLE1; 253; 1883; 1882; 10
SAMPLE1; 253; 1884; 1883; 10
SAMPLE1; 253; 1885; 1884; 12
SAMPLE1; 253; 1889; 1888; 11
SAMPLE1; 253; 1890; 1889; 12
SAMPLE1; 253; 1911; 1910; -16
SAMPLE1; 253; 1913; 1911; -11
SAMPLE1; 253; 1914; 1913; -8
SAMPLE2; 261; 1991; 1991; 0
SAMPLE2; 261; 1992; 1991; -19
SAMPLE2; 261; 1994; 1992; -58
SAMPLE2; 261; 1995; 1994; -40
SAMPLE2; 261; 1996; 1995; -21
SAMPLE2; 261; 1997; 1996; -50
SAMPLE2; 261; 1998; 1997; -60
SAMPLE2; 261; 2005; 2004; -34
SAMPLE2; 261; 2006; 2005; -23
SAMPLE2; 261; 2007; 2006; -19
SAMPLE2; 261; 2008; 2007; -29
SAMPLE2; 261; 2009; 2008; -89
SAMPLE2; 261; 2013; 2009; -14
SAMPLE2; 261; 2014; 2013; -16
今の問題は、各年の行 VALUE の累積合計を計算したいということです。ご覧のとおり、特定の年の間にギャップがあります (たとえば、SAMPLE1 では 1890 年から 1911 年まで、SAMPLE2 では 1998 年から 2005 年まで)、プロット タイプでプロットできるように、その間の各年のギャップを NA 値で埋めたいと思います。 ='b' (点と線) であり、異なるギャップが接続されないようにします。互いの後に複数の NA 値がある場合、CUMSUM 行で最後の NA 値を前の最後の数値に置き換える必要があることが重要です。
通常、REFERENCE_YEAR と SURVEY_YEAR の差は 1 です (たとえば、SAMPLE1 の最初の例では 1880 年から 1881 年まで)、場合によっては、REFERENCE_YEAR と SURVEY_YEAR の間にさまざまな期間があります (たとえば、SAMPLE1 では 1911 年から1913 年および 2009 年から 2013 年までの SAMPLE2)。この場合、累積合計の関数は 1 回だけ適用され、指定された期間は値が同じままである必要があります (プロットでは、接続された直線になります)。
すべてを詳細に説明するのは難しいですが、結果がどのように見えるかの例を提供すると、おそらく簡単になります。
NAME; ID; SURVEY_YEAR; REFERENCE_YEAR; VALUE; CUMSUM
SAMPLE1; 253; 1879; 1879; 0; 0
SAMPLE1; 253; 1880; 1879; 14; 14
SAMPLE1; 253; 1881; 1880; -10; 4
SAMPLE1; 253; 1882; 1881; 4; 8
SAMPLE1; 253; 1883; 1882; 10; 18
SAMPLE1; 253; 1884; 1883; 10; 28
SAMPLE1; 253; 1885; 1884; 12; 40
SAMPLE1; 253; 1886; 1885; NA; NA
SAMPLE1; 253; 1887; 1886; NA; NA
SAMPLE1; 253; 1888; 1887; NA; 40
SAMPLE1; 253; 1889; 1888; 11; 51
SAMPLE1; 253; 1890; 1889; 12; 63
SAMPLE1; 253; 1891; 1890; NA; NA
SAMPLE1; 253; 1892; 1891; NA; NA
SAMPLE1; 253; 1893; 1892; NA; NA
SAMPLE1; 253; 1894; 1893; NA; NA
SAMPLE1; 253; 1895; 1894; NA; NA
SAMPLE1; 253; 1896; 1895; NA; NA
SAMPLE1; 253; 1897; 1896; NA; NA
SAMPLE1; 253; 1898; 1897; NA; NA
SAMPLE1; 253; 1899; 1898; NA; NA
SAMPLE1; 253; 1900; 1899; NA; NA
SAMPLE1; 253; 1901; 1900; NA; NA
SAMPLE1; 253; 1902; 1901; NA; NA
SAMPLE1; 253; 1903; 1902; NA; NA
SAMPLE1; 253; 1904; 1903; NA; NA
SAMPLE1; 253; 1905; 1904; NA; NA
SAMPLE1; 253; 1906; 1905; NA; NA
SAMPLE1; 253; 1907; 1906; NA; NA
SAMPLE1; 253; 1908; 1907; NA; NA
SAMPLE1; 253; 1909; 1908; NA; NA
SAMPLE1; 253; 1910; 1909; NA; 63
SAMPLE1; 253; 1911; 1910; -16; 47
SAMPLE1; 253; 1912; 1911; -11; 36
SAMPLE1; 253; 1913; 1912; -11; 36
SAMPLE1; 253; 1914; 1913; -8; 28
SAMPLE2; 253; 1991; 1991; 0; 0
SAMPLE2; 253; 1992; 1991; -19; -19
SAMPLE2; 253; 1993; 1992; -58; -77
SAMPLE2; 253; 1994; 1993; -58; -135
SAMPLE2; 253; 1995; 1994; -40; -175
SAMPLE2; 253; 1996; 1995; -21; -196
SAMPLE2; 253; 1997; 1996; -50; -246
SAMPLE2; 253; 1998; 1997; -60; -306
SAMPLE2; 253; 1999; 1998; NA; NA
SAMPLE2; 253; 2000; 1999; NA; NA
SAMPLE2; 253; 2001; 2000; NA; NA
SAMPLE2; 253; 2002; 2001; NA; NA
SAMPLE2; 253; 2003; 2002; NA; NA
SAMPLE2; 253; 2004; 2003; NA; -306
SAMPLE2; 253; 2005; 2004; -34; -340
SAMPLE2; 253; 2006; 2005; -23; -363
SAMPLE2; 253; 2007; 2006; -19; -382
SAMPLE2; 253; 2008; 2007; -29; -411
SAMPLE2; 253; 2009; 2008; -89; -500
SAMPLE2; 253; 2010; 2009; -14; -514
SAMPLE2; 253; 2011; 2010; -14; -514
SAMPLE2; 253; 2012; 2011; -14; -514
SAMPLE2; 253; 2013; 2012; -14; -514
SAMPLE2; 253; 2014; 2013; -16; -530
このかなり複雑なケースのヘルプをいただければ幸いです。ありがとうございました!