0

ここで尋ねられた質問 ( R: Applyingcumulative sum function and filling data gaps with NA for plotting ) を少し分解して、より小さなサンプルを投稿するように依頼されました。これが私のサンプルデータです: https://dl.dropboxusercontent.com/u/16277659/inputdata.csv

NAME;       ID;     SURVEY_YEAR;    REFERENCE_YEAR; VALUE
SAMPLE1;    253;    1883;           1883;           0
SAMPLE1;    253;    1884;           1883;           NA
SAMPLE1;    253;    1885;           1884;           12
SAMPLE1;    253;    1890;           1889;           17
SAMPLE2;    261;    1991;           1991;           0
SAMPLE2;    261;    1992;           1991;           -19
SAMPLE2;    261;    1994;           1992;           -58
SAMPLE2;    261;    1995;           1994;           -40

列 VALUE の累積合計を計算し、その間の年のデータ ギャップを NA 値で埋めたいと思います (さらに処理するために他の列が必要なため、データの構造は同じである必要があります)。

データのギャップを埋める場合、SAMPLE1 のように NA を埋める必要があります。CUMSUM 列に複数の NA を入力する場合は、NA の後の値の位置に注意してください (たとえば、最後の CUMSUM 値は、VALUE の最後の NA に加えて入力する必要があります (プロットの理由で使用されます)。

例外として、REFERENCE_YEAR と SURVEY_YEAR の間の期間が 1 年を超える場合は、SAMPLE2 のように 1992 年から 1994 年までの期間の値を列に書き込む必要があります。

これは単なるサンプル データセットです。実際のデータセットは、いくつかの列と約 40000 行で構成されています。BaseRのソリューションが最適です。各 SAMPLE の最初の行で REFERENCE_YEAR と SURVEY_YEAR が等しいのは、各グループのゼロ列を書き込むために使用するコードの結果です。

NAME;       ID;     SURVEY_YEAR;    REFERENCE_YEAR; VALUE;  CUMSUM
SAMPLE1;    253;    1883;           1883;           0;      0
SAMPLE1;    253;    1884;           1883;           NA;     NA
SAMPLE1;    253;    1885;           1884;           12;     12
SAMPLE1;    253;    1886;           1885;           NA;     NA
SAMPLE1;    253;    1887;           1886;           NA;     NA
SAMPLE1;    253;    1888;           1887;           NA;     NA
SAMPLE1;    253;    1889;           1888;           NA;     12
SAMPLE1;    253;    1890;           1889;           17;     29
SAMPLE2;    261;    1991;           1991;           0;      0
SAMPLE2;    261;    1992;           1991;           -19;    -19
SAMPLE2;    261;    1993;           1992;           -58;    -77
SAMPLE2;    261;    1994;           1992;           -58;    -77
SAMPLE2;    261;    1995;           1994;           -40;    -117

-------------------------------------------------- ----------------------------------------------


4

1 に答える 1

3

datがデータセットの場合、1 つの方法は次のようになります。

SURVEY_YEARそれぞれの最小値と最大値の間を拡張して、新しいデータセットを作成しますNAME

 dat1 <- setNames(stack(
             with(dat, tapply(SURVEY_YEAR, NAME, 
                FUN=function(x) seq(min(x), max(x)))))[2:1], c("NAME", "SURVEY_YEAR"))

dat1新しいデータセットを古いデータセットとマージするdat

 datN <- merge(dat1, dat, all=TRUE)

の欠損値をREFERENCE_YEARSURVEY_YEARの行の値で置き換えます

 datN$REFERENCE_YEAR[is.na(datN$REFERENCE_YEAR)] <- datN$SURVEY_YEAR[which(is.na(datN$REFERENCE_YEAR))-1]

na.locffromを使用しzooて NA を入力しますID

 library(zoo)
 datN$ID <- na.locf(datN$ID)
 datN$CUMSUM <- NA

NAcumsum以外のVALUE行で実行し、

 datN$CUMSUM[!is.na(datN$VALUE)] <-  unlist(with(datN, tapply(VALUE, NAME, FUN=function(x) cumsum(x[!is.na(x)]))))

SURVEY_YEAR と REFERENCE_YEAR の差が 1 より大きい行を探します

 indx <- with(datN, SURVEY_YEAR-REFERENCE_YEAR)>1

VALUEおよびCUMSUM列の行を次の行の値に置き換えます

 datN[,c("VALUE", "CUMSUM")] <- lapply(datN[,c("VALUE", "CUMSUM")], function(x) {x[which(indx)-1] <- x[indx]; x})

NAの値の一部CUMSUMを前のnon-NA値に変更します

datN$CUMSUM <- with(datN, ave(CUMSUM, NAME, FUN = function(x) {
x1 <- is.na(x)
rl <- rle(x1)
indx <- which(!(!(abs(x1 - 1) * (cumsum(x1) != 0) * sequence(rl$lengths)))) - 1
indx1 <- indx[indx - c(1, indx[-length(indx)]) > 1]
indxn <- unlist(lapply(indx1, function(y) {
    indx2 <- which(!is.na(x))
    tail(indx2[which(indx2 < y)], 1)
}))
x[indx1] <- x[indxn]
x
}))

datN
#      NAME SURVEY_YEAR  ID REFERENCE_YEAR VALUE CUMSUM
#1  SAMPLE1        1883 253           1883     0      0
#2  SAMPLE1        1884 253           1883    NA     NA
#3  SAMPLE1        1885 253           1884    12     12
#4  SAMPLE1        1886 253           1885    NA     NA
#5  SAMPLE1        1887 253           1886    NA     NA
#6  SAMPLE1        1888 253           1887    NA     NA
#7  SAMPLE1        1889 253           1888    NA     12
#8  SAMPLE1        1890 253           1889    17     29
#9  SAMPLE2        1991 261           1991     0      0
#10 SAMPLE2        1992 261           1991   -19    -19
#11 SAMPLE2        1993 261           1992   -58    -77
#12 SAMPLE2        1994 261           1992   -58    -77
#13 SAMPLE2        1995 261           1994   -40   -117
于 2014-08-13T04:53:25.840 に答える