11

私が取り組んでいるデータ セットの最後に欠損値がある場合、「最後の観察の繰り越し」を実装したいと考えています。

これを行うための簡単なコードを次に示します(その後の質問)。

LOCF <- function(x)
{
    # Last Observation Carried Forward (for a left to right series)
    LOCF <- max(which(!is.na(x))) # the location of the Last Observation to Carry Forward
    x[LOCF:length(x)] <- x[LOCF]
    return(x)
}


# example:
LOCF(c(1,2,3,4,NA,NA))
LOCF(c(1,NA,3,4,NA,NA))

現在、これは単純なベクトルに最適です。しかし、データフレームでどこで試して使用するか:

a <- data.frame(rep("a",4), 1:4,1:4, c(1,NA,NA,NA))
a
t(apply(a, 1, LOCF)) # will make a mess

データ フレームを文字マトリックスに変換します。

マトリックスに変換せずに、data.frame で LOCF を実行する方法を考えられますか? (ループなどを使用して混乱を修正することもできますが、よりエレガントなソリューションが欲しいです)

4

7 に答える 7

23

これはすでに存在します:

library(zoo)
na.locf(data.frame(rep("a",4), 1:4,1:4, c(1,NA,NA,NA)))
于 2010-05-05T19:31:33.810 に答える
10

na.locf 関数のためだけに Zoo のような大きなパッケージをロードしたくない場合は、入力ベクトルに主要な NA がいくつかある場合にも機能する短い解決策を次に示します。

na.locf <- function(x) {
  v <- !is.na(x)
  c(NA, x[v])[cumsum(v)+1]
}
于 2017-01-19T21:38:43.270 に答える
4

まさにこの機能を実装するパッケージがたくさんあります。(基本的な機能は同じですが、追加オプションが若干異なります)

  • 時空::na.locf
  • imputeTS::na.locf
  • 動物園::na.locf
  • xts::na.locf
于 2016-11-10T17:53:39.850 に答える
2

この質問は古いですが、後世のために...最良の解決策は、roll=Tでdata.tableパッケージを使用することです。

于 2013-04-09T15:26:11.453 に答える
0

私はループを使用してこれを解決することになりました:

fillInTheBlanks <- function(S) {
  L <- !is.na(S)
  c(S[L][1], S[L])[cumsum(L)+1]
}


LOCF.DF <- function(xx)
{
    # won't work well if the first observation is NA

    orig.class <- lapply(xx, class)

    new.xx <- data.frame(t( apply(xx,1, fillInTheBlanks) ))

    for(i in seq_along(orig.class))
    {
        if(orig.class[[i]] == "factor") new.xx[,i] <- as.factor(new.xx[,i])
        if(orig.class[[i]] == "numeric") new.xx[,i] <- as.numeric(new.xx[,i])
        if(orig.class[[i]] == "integer") new.xx[,i] <- as.integer(new.xx[,i])   
    }

    #t(na.locf(t(a)))

    return(new.xx)
}

a <- data.frame(rep("a",4), 1:4,1:4, c(1,NA,NA,NA))
LOCF.DF(a)
于 2010-05-05T21:01:02.033 に答える
0

代わりにapply()を使用lapply()して、結果のリストを に変換できますdata.frame

LOCF <- function(x) {
    # Last Observation Carried Forward (for a left to right series)
    LOCF <- max(which(!is.na(x))) # the location of the Last Observation to Carry Forward
    x[LOCF:length(x)] <- x[LOCF]
    return(x)
}

a <- data.frame(rep("a",4), 1:4, 1:4, c(1, NA, NA, NA))
a
data.frame(lapply(a, LOCF))
于 2015-07-22T13:48:28.947 に答える