2014-11-12 19 views
12

Basit bir sorunum var, ancak üstesinden gelmek için mantığı kavrayamadım.NA'lara abonelikli ödevlerde izin verilmez

NA'lı sayısal vektörler var ve bunlara koşullu bir işlem uygulamak istiyorum.

x <- c(1,3,5,7,NA,2,4,6) 
x[x>=5] <- c(1:8)[x>=5] 
x[x<5] <- (c(1:8)*10)[x<5] 

It "UA'lar indisli atamaları izin verilmez" hata verir, bu yüzden bunun için mantıklı bir çözüm ne olacağını bilmek istiyorum,:

sorunuma benzer basit bir örnektir Her bir ilişkilendirmeyi çalıştırmanın beklendiği gibi çalıştığı göz önünde bulundurulduğunda.

ben beklenen sonucunu istiyorum: Tercihen

[1] 10 20 3 4 NA 60 70 8 

bu operasyon yaşları alıyor tekrarlamalar dolu boş modelleme için bir fonksiyonu zaten olduğu gibi döngü için yapmak zorunda kalmadan.

Sana atama ve Altsimgeleme intermixing düşünüyorum, önceden Leonardo

+2

Bu çok ilginç. Görünüşe göre, tam sayıyı "NA" ile birleştiremezsiniz, ancak RHS üzerinde birden fazla değeriniz varsa ... 'x [c (NA, 1)] <- 100' ve ' x [NA] <- 100' her ikisi de çalışırken, x [c (NA, 1)] <- 100: 101' veya ' x [NA] <- 100: 101', –

+2

değil. Bu hata mesajına ulaştığı için değerli bir sorudur. Ancak, kodunuzun NA kaynaklı hatalar olmadan çalıştırılsa bile, beklenen sonucu vermeyeceğini unutmayın. Kodunuzun 2. satırı, yukarıdaki 3 ve 4 sonucunu tahmin etmek için kullandığınız 5 ve 7. orijinal değerlerin üzerine yazacaktır (30 ve 40 yerine) ve zaman çizgisi 3'e göre 3 ve 4 olacaktır. 30 ve 40 olmaları için. Dene: 'x [x> = 5 &! is.na (x)] <- c(1:8)[x> = 5 &! is.na (x)]; x [x <5 &! Is.na (x)] <- (c (1: 8) * 10) [x <5 &! Is.na (x)] ' –

cevap

8

Mantığınızın alt kümedeki NA'ları da hariç tutması gerekir. Aşağıdaki örneğe bakın. Alt kümeleri vektörleri, x değiştirilmeden önce saklanır.

x <- c(1,3,5,7,NA,2,4,6) 
subset1 <- x>=5 & !is.na(x) 
subset2 <- x<5 & !is.na(x) 

x[subset1] <- which(subset1) 
x[subset2] <- 10*which(subset2) 
0

teşekkür ederiz. Neyin peşinde olduğunuza inanıyorum:

x <- c(1,3,5,7,NA,2,4,6) 
x.greater <- c(1:8)[x>=5] 
x.less <- (c(1:8)*10)[x<5] 

x.greater 
# 3 4 NA 8 
x.less 
# 10 20 NA 60 70 

result <- c(x.greater, x.less) 
result 
# 3 4 NA 8 10 20 NA 60 70 
İlgili konular