2014-11-12 17 views
12

Tôi có một vấn đề đơn giản, nhưng tôi không thể nắm bắt được logic để khắc phục nó.NA không được phép trong nhiệm vụ được chỉ định

Tôi có vectơ số bằng NA và muốn áp dụng một hoạt động tình trạng phụ thuộc vào chúng.

Một ví dụ đơn giản tương tự như vấn đề của tôi là:

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] 

Nó trả về lỗi "NA không được phép vào tập subscripted", vì vậy tôi muốn biết điều gì sẽ là một giải pháp hợp lý cho rằng, cho rằng chạy từng phân bổ riêng biệt hoạt động như mong đợi.

Tôi muốn có kết quả dự kiến ​​của:

[1] 10 20 3 4 NA 60 70 8 

Tốt mà không cần phải thực hiện một vòng lặp for, như hoạt động này đã nằm trong một chức năng cho mô hình rỗng với nhiều lần lặp mà đang lứa tuổi.

Cảm ơn bạn trước, Leonardo

+2

Điều này rất thú vị. Dường như bạn không thể kết hợp các số nguyên với 'NA' trong khi chỉ đặt và chỉ định nếu bạn có nhiều giá trị trên RHS ... I.e. 'X [c (NA, 1)] <- 100' và ' x [NA] <- 100' cả hai sẽ làm việc, trong khi 'x [c (NA, 1)] <- 100: 101' hoặc ' x [NA] <- 100: 101' sẽ không –

+2

Đây là một câu hỏi có giá trị khi nó nhận được thông báo lỗi đó. Nhưng điều quan trọng cần lưu ý là ngay cả khi mã của bạn chạy mà không có các lỗi do NA gây ra, nó sẽ không tạo ra kết quả mong đợi đó. Dòng 2 mã của bạn sẽ ghi đè các giá trị ban đầu của 5 và 7 mà bạn đã sử dụng để dự đoán kết quả của 3 và 4 ở trên (thay vì 30 và 40), và chúng sẽ là 3 và 4 theo dòng thời gian 3 được gọi, gây ra chúng trở thành 30 và 40. Thử: '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)] ' –

Trả lời

8

Logic của bạn sẽ cũng cần phải loại trừ NA trong tập hợp con. Xem ví dụ sau. Lưu ý vectơ tập hợp con được lưu trữ trước khi x được sửa đổi.

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

Tôi nghĩ rằng bạn đang xen phân công và subscripting. Tôi tin rằng những gì bạn đang sau là một cái gì đó gần gũi hơn với điều này:

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 
Các vấn đề liên quan