添加包含值和NA的列

时间:2012-12-29 20:21:33

标签: r

  

可能重复:
  Populate NAs in a vector using prior non-NA values?

我一直试图弄清楚这一点,但我似乎无法找到解决这个编码问题的方法。我想创建一个重复相同值的列向量,直到下一个非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

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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)

答案 2 :(得分: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"