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 回答