Próbuję obliczyć opóźnioną różnicę (lub rzeczywisty wzrost) dla danych, które zostały nieumyślnie zsumowane. Każdy kolejny rok w danych zawiera wartości z poprzedniego roku. Zestaw przykładowe dane mogą być tworzone z tym kodem:Odejmij poprzedni rok od wartości z każdego zgrupowanego wiersza w ramce danych
set.seed(1234)
x <- data.frame(id=1:5, value=sample(20:30, 5, replace=T), year=3)
y <- data.frame(id=1:5, value=sample(10:19, 5, replace=T), year=2)
z <- data.frame(id=1:5, value=sample(0:9, 5, replace=T), year=1)
(df <- rbind(x, y, z))
mogę użyć kombinacji lapply()
i split()
obliczyć różnicę między każdego roku dla każdego unikalnego ID, tak jak poniżej:
(diffs <- lapply(split(df, df$id), function(x){-diff(x$value)}))
jednak , ze względu na naturę funkcji diff()
, nie ma wyników dla wartości w roku 1, co oznacza, że po spłaszczeniu listy diffs
z Reduce()
, nie mogę dodać rzeczywistych rocznych wzrostów z powrotem do ramki danych, tak jak to :
df$actual <- Reduce(c, diffs) # flatten the list of lists
W tym przykładzie występuje tylko 10 obliczonych różnic lub opóźnień, podczas gdy w ramce danych znajduje się 15 wierszy, więc R generuje błąd podczas próby dodania nowej kolumny.
Jak utworzyć nową kolumnę rzeczywistych wzrostów z (1) wartościami dla roku 1 i (2) obliczonych różnic/opóźnień dla wszystkich kolejnych lat?
To jest wynik, którego ostatecznie szukam. Moja lista list diffs
oblicza rzeczywiste wartości dla lat 2 i 3 po prostu dobrze.
id value year actual
1 21 3 5
2 26 3 16
3 26 3 14
4 26 3 10
5 29 3 14
1 16 2 10
2 10 2 5
3 12 2 10
4 16 2 7
5 15 2 13
1 6 1 6
2 5 1 5
3 2 1 2
4 9 1 9
5 2 1 2
Dziwne. Moje 'set.seed()' nie działało najwyraźniej. Zaktualizowałem go liczbami rzeczywistymi. – Andrew
To jest fantastyczne! Czy istnieje prosty sposób na sprawdzenie, czy którakolwiek z tych funkcji działa dla dowolnej liczby kolumn, np. Gdyby były 2 błędnie zagregowane zmienne: 'x <- data.frame (id = 1: 5, value = sample (20:30, 5, replace = T), value1 = sample (20:30, 5, replace = T), year = 3) ', itp.? – Andrew
Mam na myśli, staram się uruchomić to samo 'as.vector (sapply (seq_along (...) funkcja dla wielu kolumn na raz (nie tylko 2) .Zapieram zasadniczo uruchomić tę funkcję z "lapply" w zakresie kolumn (2: x) . – Andrew