Myślę, że mam łatwe pytanie, ale szukam bardziej wydajnego (pod względem wymaganego mocy obliczeniowej) sposobu wykonania następującego. Mam zestaw danych z tysiącami kolumn, a ja po prostu chciałbym LOCF (przenieść ostatnią obserwację) dla każdego z nich. Jedynym warunkiem, którego potrzebuję do szacunku, jest to, że najwyższa wartość jest przeniesiona do przodu

Moje dane wyglądają na coś takiego

df <- data.frame("ID" = c("Alpha", "Alpha", "Alpha", "Alpha", "Alpha", "Beta", "Beta", "Beta", "Beta", "Beta"), "Year" = c(1970, 1980, 1990, 2000, 2010, 1970, 1980, 1990, 2000, 2010), "Var" = c(NA, NA, 0, NA, NA, NA, 1, NA, 2, NA), "otherVar" = c(NA, 2.34, 1.3, NA, NA, 1.3, NA, 3.5, 1.5, NA))
df
#>       ID Year Var otherVar
#> 1  Alpha 1970  NA       NA
#> 2  Alpha 1980  NA     2.34
#> 3  Alpha 1990   0     1.30
#> 4  Alpha 2000  NA       NA
#> 5  Alpha 2010  NA       NA
#> 6   Beta 1970  NA     1.30
#> 7   Beta 1980   1       NA
#> 8   Beta 1990  NA     3.50
#> 9   Beta 2000   2     1.50
#> 10  Beta 2010  NA       NA

I chciałbym uzyskać następujące dane

final <- data.frame("ID" = c("Alpha", "Alpha", "Alpha", "Alpha", "Alpha", "Beta", "Beta", "Beta", "Beta", "Beta"), "Year" = c(1970, 1980, 1990, 2000, 2010, 1970, 1980, 1990, 2000, 2010), "Var" = c(NA, NA, 0, 0, 0, NA, 1, 1, 2, 2), "otherVar" = c(NA, 2.34, 2.34, 2.34, 2.34, 1.3, 1.3, 3.5, 3.5, 3.5))
final
#>       ID Year Var otherVar
#> 1  Alpha 1970  NA       NA
#> 2  Alpha 1980  NA     2.34
#> 3  Alpha 1990   0     2.34
#> 4  Alpha 2000   0     2.34
#> 5  Alpha 2010   0     2.34
#> 6   Beta 1970  NA     1.30
#> 7   Beta 1980   1     1.30
#> 8   Beta 1990   1     3.50
#> 9   Beta 2000   2     3.50
#> 10  Beta 2010   2     3.50

Jak wspomniałem o tym, że dla każdej z moich zmiennych chciałbym wypełnić NAS z ostatnią obserwacją przeniesioną. Ale chciałbym tylko zachować najwyższą wartość. Na przykład otherVar w 1970 r. Wyniósł 1,3, więc ta wartość została przeniesiona do 1980, aby wypełnić NA. W 1990 r. Wartość otherVar wynosi 3,5, więc "zabiera miejsce" 1,3, a wynik otherVar w 1990 roku wynosi 3,5. Wreszcie, w 2000 r. Wynik otherVar wynosi 1,5. od 1,5 ° C 3.5 W końcowym zestawie danych jest przenoszona większa wartość.

Chciałbym znaleźć najmniejszą metodę intensywnie obliczeniowo, ponieważ muszę to zrobić za tysiące zmiennych.

Z góry dziękuję za pomoc

Z poważaniem

r
4
Alex 28 listopad 2019, 21:02

1 odpowiedź

Najlepsza odpowiedź

Możemy użyć cummax po replace ING na za pomocą 0 i później zmień ponownie 0 do NA

library(dplyr)
library(tidyr)
df %>% 
   group_by(ID) %>% 
   mutate_at(3:4,  ~ na_if(cummax(replace_na(., -999)), -999))
2
akrun 28 listopad 2019, 18:59