2012-12-29 57 views
3

可能重复:
Populate NAs in a vector using prior non-NA values?添加一列与价值观和NAS

我一直在试图找出这了一会儿,但我似乎无法找到一个解决这个编码问题。我想创建一个列向量,它会重复相同的值,直到下一个非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 
+0

您具有恒定的第二列... –

+0

还是你想'A1,A1,A1,A2,A2,a3'在S第二列? –

+0

或者甚至可能是'a1,a1,a1,a4,a4,a6'。 –

回答

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" 

为了什么// @阿伦的评论指示(重复的问题),这里是一个方法:

library(zoo) 
na.locf(x) 
[1] "A" "A" "A" "B" "B" "A" 
+1

或简单'paste0(“a”,cumsum(!is.na(x)))'' – flodel

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) 
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"