3

重複の可能性:
以前の非 NA 値を使用してベクトルに NA を設定しますか?

私はしばらくこれを理解しようとしてきましたが、このコーディングの問題に対する解決策を見つけることができないようです. NA次の非列が別の列に表示されるまで同じ値を繰り返す列ベクトルを作成したいと思います。ここに、私が達成したいことを示す表を示します (列 2)。

         [,1] [,2]
    [1,] A     a1
    [2,] NA    a1
    [3,] NA    a1
    [4,] B     a2
    [5,] NA    a2
    [6,] A     a3

混乱して申し訳ありません。前に記事を書いていたときは、本当にストレスを感じていたに違いありません。列 2 を修正しました (上記を参照してください)。あなたの投稿を読んだ後、効率的でもエレガントでもありませんが、私が思いついたコードは次のとおりです。

     d <- paste("a", 1:sum(!is.na(column1)), sep="")  # get a1, a2, a3  
     column2 <- rep(NA, length(column1)  #create empty vector w/ column1 length
     column2[!is.na(colum1)] <- d #when col1 has a value, populate col2 with a1   
     e  <- na.locf.default(column2) #fill NAs in col2 with previous value
4

3 に答える 3

3

与えられたx

x <- c('A', NA, NA, 'B', NA, 'A')

あなたの質問の最新の編集によると、あなたが望むもののために:

y <- x
y[!is.na(x)] <- seq(sum(!is.na(x)))

paste0('a', na.locf(y))
[1] "a1" "a1" "a1" "a2" "a2" "a3"

@flodel が観察したように、文字列内の非 NA 文字を数えています。これはそれを直接行います:

> cumsum(!is.na(x))
[1] 1 1 1 2 2 3

> paste0('a', cumsum(!is.na(x)))
[1] "a1" "a1" "a1" "a2" "a2" "a3"

この結果a1, a1, a1, a4, a4, a6は、どの値が繰り返されたかを示しており、それ自体は論理的に見えますが、必要なものではありません。

y <- x
y[!is.na(x)] <- seq_along(x)[!is.na(x)]

paste0('a', na.locf(y))
[1] "a1" "a1" "a1" "a4" "a4" "a6"

@Arunのコメントが示すもの(重複した質問)については、次の方法があります。

library(zoo)
na.locf(x)
[1] "A" "A" "A" "B" "B" "A"
于 2012-12-29T20:30:13.557 に答える
2

文字の値が「NA」、つまり北米の略語である場合、問題が発生する可能性があります。代わりに、NA_character_NA と出力されて混乱することもあります。

 c("NA", NA_character_, NA)
#[1] "NA" NA   NA 
is.na(c("NA", NA_character_, NA))
#[1] FALSE  TRUE  TRUE

....しかし、それが問題ではないと仮定すると、マシューが提案したように実行してください:

require(zoo)
filled <- na.locf(vec)
于 2012-12-29T20:37:47.410 に答える
1

関数zooを使用して、パッケージなしでこれをかなり簡潔に行うこともできます。rle

x <- c('A', NA, NA, 'B', NA, 'A')
x.rle <- rle(replace(x, which(is.na(x)), na.str <- '.'))
x[is.na(x)] <- with(x.rle, rep(values[which(values == na.str) - 1], 
                               lengths[values == na.str]))

# [1] "A" "A" "A" "B" "B" "A"
于 2012-12-29T23:13:32.200 に答える