Rozważmy następujący wektor nazwany x
.Obliczenie sumy kumulacji() podczas ignorowania wartości 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
Chciałbym obliczyć skumulowana suma x
ignorując wartości NA
. Ponieważ nie ma argumentu na.rm
dla cumsum()
, jest to nieco trudne.
Mogę to zrobić w ten sposób.
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
Ale wydaje się to przesadne i powoduje wiele nowych przydziałów/kopii. Jestem pewien, że jest lepszy sposób.
Co lepsze metody są tam wrócić skumulowaną sumę natomiast skutecznie ignorującNA
wartości?
One-liner robi to samo: '" [<- "(x,! Is.na (x), cumsum (na.omit (x)))' – lebatsnok
Nie jest bardziej czytelną wersją tego samego rzecz 'x [! is.na (x)] <- cumsum (na.omit (x))'? –
Jest bardziej czytelny, ale to nie to samo. '" [<- "(x, bla ...' robi to, co OP zapytał * bez zmiany x *, twoja wersja przypisuje podzbiór na x i zwraca 'cumsum (na.omit (x))'. Więc to zdecydowanie nie to samo - Bardziej czytelna wersja jednolinijnego, robiącego to samo, byłaby to: 'replace (x,! is.na (x), cumsum (na.omit (x)))' – lebatsnok