2012-12-29 58 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"