2010-10-11 62 views
6

我有一個包含NA的值向量。這些值需要由無法處理NA的外部程序處理,因此它們被剝離,寫入文件,處理,然後讀回,導致向量的長度爲非NAs的數量。例如,假設輸入是7 3 4 NA 5 4 6 NA 1 NA,那麼輸出將只是7個值。我需要做的是重新插入新輔助器。將NA重新插入到一個向量中

因此,考慮兩個矢量的X和Y:

> X 
[1] 64 1 9 100 16 NA 25 NA 4 49 36 NA 81 
> Y 
[1] 8 1 3 10 4 5 2 7 6 9 

農產品:

8 1 3 10 4 NA 5 NA 2 7 6 NA 9 

(你可能會注意到,X爲Y^2,那只是一個例子)。

我能敲出一個函數來做到這一點,但我不知道是否有做...拆分,列表,長...嗯任何漂亮調皮的方式...

+0

雖然只是舉例,你試試!開方(x)的 – 2010-10-11 21:08:01

回答

3

同一主題

rena <- function(X,Z){ 
    X[which(!is.na(X))]=Z  
    X 
} 

R安置另一個變體自動填充與NA的其餘部分。

編輯:由Marek糾正。

+1

錯誤:'rena(c(1,2,NA),c(10,20))'。爲了解決'Y'問題,使用'X'作爲我對Spacedman答案的評論。 – Marek 2010-10-11 20:59:37

+0

@marek:很好。 Thx爲更正。 – 2010-10-11 21:06:50

4

回答我的問題很可能是很不禮貌的,但我覺得這大概是最巧妙的:

rena <- function(X,Z){ 
Y=rep(NA,length(X)) 
Y[!is.na(X)]=Z  
Y 
} 
+1

可以縮短爲'函數(X,Z){X [is.na(X) ] < - Z者除外; X}'。 – Marek 2010-10-11 19:07:42

+1

回答你自己的問題其實很好! – Contango 2013-09-28 23:52:39

5

na.omit保持NA在原系列中的位置的屬性,所以你可以用它來知道往哪裏放缺失值:

Y <- sqrt(na.omit(X)) 
Z <- rep(NA,length(Y)+length(attr(Y,"na.action"))) 
Z[-attr(Y,"na.action")] <- Y 
#> Z 
# [1] 8 1 3 10 4 NA 5 NA 2 7 6 NA 9 
4

也可以嘗試更換:

replace(X, !is.na(X), Y) 
+0

迄今爲止+1最清潔的解決方案。 – 2010-10-12 09:02:50