2015-10-12 17 views
5

Tôi đang cố gắng sử dụng rowwisemutate với hàm có thể trả về giá trị NA nhưng đang gặp lỗi. Hãy xem xét ví dụ contrived này (mà rõ ràng không phải là một trường hợp cho rowwise, nhưng minh họa lỗi):dplyr :: lỗi hàng, đột biến và NA

này hoạt động:

library(dplyr) 
data.frame(k=rnorm(10)) %>% mutate(l = ifelse(k > 0, 1, NA)) 

      k l 
1 -1.40223573 NA 
2 1.47581873 1 
3 0.35938746 1 
4 0.87240448 1 
5 -0.61991535 NA 
6 -1.88152820 NA 
7 0.25837350 1 
8 -0.02250385 NA 
9 0.92757943 1 
10 0.49023792 1 

Nhưng điều này mang lại một lỗi:

library(dplyr) 
data.frame(k=rnorm(10)) %>% rowwise() %>% mutate(l = ifelse(k > 0, 1, NA)) 

Error: incompatible types, expecting a numeric vector 

Trả lời

5

Lưu ý: Tôi đã nộp github issue #1448 về lỗi trong kết quả của câu trả lời này.

Cập nhật ngày 29 tháng 10 năm 2015: Dường như lỗi này trong rowwise() đã được sửa. Kiểm tra liên kết ở trên để biết chi tiết.


Trước hết, không có lý do gì để làm cho hoạt động này hoạt động tốt.

Theo như lỗi xảy ra, NA là loại hợp lý. Bạn sẽ cần phải sử dụng NA_real_ trong cuộc gọi của mình tới ifelse() trong hoạt động hàng thông minh này. Hoặc như Ben Bolker ghi chú trong các ý kiến ​​dưới đây, bạn có thể quấn ifelse() với as.numeric().

data.frame(k = rnorm(10)) %>% 
    rowwise() %>% 
    mutate(l = ifelse(k > 0, 1, NA_real_)) 
# Source: local data frame [10 x 2] 
# Groups: <by row> 
# 
#    k  l 
#   (dbl) (dbl) 
# 1 -1.7105691140 NA 
# 2 -0.0702667985 NA 
# 3 -0.5505724960 NA 
# 4 -0.7444839870 NA 
# 5 -0.0005646999 NA 
# 6 -0.3702584194 NA 
# 7 0.2596026787  1 
# 8 0.4149810662 NA <-- error here pointed out by David A (see comments) 
# 9 -0.4698540654 NA 
# 10 1.0961705022  1 

Lưu ý rằng bạn cũng có thể sử dụng số nguyên, như trong

mutate(l = ifelse(k > 0, 1L, NA_integer_)) 

Nhưng bạn không thể trộn logicals và số thực/số nguyên trong ops hàng-khôn ngoan nó dường như.

+0

clunkily hơn, 'as.numeric (ifelse (...))' cũng sẽ làm việc –

+0

@BenBolker Vì nó theo hàng, 'mutate (l = if (k> 0) 1 else NA_real_)' cũng hoạt động. Có lẽ, nó sẽ * không * được rowwise, mặc dù. – Frank

+0

Cảm ơn, vì vậy tôi đoán có một số triết lý đằng sau này (theo hàng, có lẽ?) Phải làm gì với các giá trị không đúc khi đưa chúng vào một véc tơ? – blindjesse

Các vấn đề liên quan