Hãy xem xét vector có tên sau đây x
.Tính toán cumsum() trong khi bỏ qua các giá trị NA
(x <- setNames(c(1, 2, 0, NA, 4, NA, NA, 6), letters[1:8]))
# a b c d e f g h
# 1 2 0 NA 4 NA NA 6
tôi muốn để tính toán số tiền tích lũy của x
trong khi bỏ qua các NA
giá trị. Vì không có đối số na.rm
cho cumsum()
, điều này hơi phức tạp một chút.
Tôi có thể thực hiện theo cách này.
y <- setNames(numeric(length(x)), names(x))
z <- cumsum(na.omit(x))
y[names(y) %in% names(z)] <- z
y[!names(y) %in% names(z)] <- x[is.na(x)]
y
# a b c d e f g h
# 1 3 3 NA 7 NA NA 13
Nhưng điều này có vẻ quá mức và tạo nhiều bài tập/bản sao mới. Tôi chắc chắn có một cách tốt hơn.
Có phương pháp nào tốt hơn để trả lại tổng tích lũy trong khi bỏ qua hiệu quả các giá trịNA
?
một lớp lót làm cùng một điều: '" [<- "(x,! Is.na (x), cumsum (na.omit (x)))' – lebatsnok
Không phải là phiên bản dễ đọc hơn của cùng một điều 'x [! is.na (x)] <- cumsum (na.omit (x))'? –
Nó dễ đọc hơn nhưng không giống nhau. '" [<- "(x, bla ...' làm những gì OP yêu cầu * mà không thay đổi x *, phiên bản của bạn không gán sub trên x và trả về 'cumsum (na.omit (x))'. cùng một điều - Một phiên bản dễ đọc hơn của một lớp lót, làm điều tương tự, sẽ là: 'thay thế (x,! is.na (x), cumsum (na.omit (x)))' – lebatsnok