6

R を使用して、複数の時系列を含むデータ フレームの最初と最後から NA 値をトリミングしようとしています。forループとzooパッケージを使用して目標を達成しましたが、予想通り、大きなデータフレームでは非常に非効率的です。

私のデータ フレームは次のようになり、一意の ID で識別される各時系列の 3 つの列が含まれます。この場合、AAA、B、および CCC です。

id   date          value
AAA  2010/01/01    NA
AAA  2010/02/01    34
AAA  2010/03/01    35
AAA  2010/04/01    30
AAA  2010/05/01    NA
AAA  2010/06/01    28
B    2010/01/01    NA
B    2010/02/01    0
B    2010/03/01    1
B    2010/04/01    2
B    2010/05/01    3
B    2010/06/01    NA
B    2010/07/01    NA
B    2010/07/01    NA
CCC  2010/01/01    0
CCC  2010/02/01    400
CCC  2010/03/01    300
CCC  2010/04/01    200
CCC  2010/05/01    NA

各時系列の開始と終了、この場合は AAA、B、および CCC から NA 値を効率的に削除する方法を知りたいです。したがって、このように見えるはずです。

id   date          value
AAA  2010/02/01    34
AAA  2010/03/01    35
AAA  2010/04/01    30
AAA  2010/05/01    NA
AAA  2010/06/01    28
B    2010/02/01    0
B    2010/03/01    1
B    2010/04/01    2
B    2010/05/01    3
CCC  2010/01/01    0
CCC  2010/02/01    400
CCC  2010/03/01    300
CCC  2010/04/01    200
4

2 に答える 2

7

私はこのようにします、それは非常に速いはずです:

require(data.table)
DT = as.data.table(your data)   # please provide something pastable

DT2 = DT[!is.na(value)]
setkey(DT,id,date)
setkey(DT2,id,date)
tokeep = DT2[DT,!is.na(value),rolltolast=TRUE,mult="last"]
DT = DT[tokeep]

これは、各グループ内で、一般的な非NAをロールフォワードすることで機能しますが、最後のNAを超えないようにします。

mult="last"オプションです。v1.8.0(CRAN上)を使用すると、速度が向上するはずです。それがある場合とない場合のタイミングに興味があります。デフォルトでdata.tableはグループ(mult="all")に参加しますが、この場合、キーのすべての列に参加しており、キーが一意であることがわかります。つまり、キーに重複はありません。v1.8.1(開発中)では、これについて知る必要はなく、より多くの面倒を見ることができます。

于 2012-05-30T09:25:14.313 に答える
0

データがデータ フレームにある場合data

fun <- function(x)
{
    x$value[is.na(x$value)] <- "NA"
    tmp <- rle(x$value)
    values <- tmp$values
    lengths <- tmp$lengths
    n <- length(values)

    nr <- nrow(x)
    id <- c()
    if(values[1] == "NA") id <- c(id, 1:lengths[1])
    if(values[n] == "NA") id <- c(id, (nr-lengths[n]+1):nr)
    if(length(id) == 0)return(x)
    x[-id,]
}

do.call(rbind,
        by(data, INDICES=data$id,
           FUN=fun))

私が推測する最もエレガントなソリューションではありません。この投稿の気分で。

于 2012-05-30T08:52:02.260 に答える