2016-07-11 11 views
1

ich einen Datenrahmen wie dieses:Interpolation fehlende Werte und kumulative Summe der Durchführung auf der Basis anderer Spalten in R

wpt ID Fuel Dist Express Local 
1  S36 12 1  1   0 
2  S36 14 2  1   0 
inter S36 NA NA 1   0 
inter S36 NA NA 1   0 
3  S36 16 4  1   0 
inter S36 NA NA 0   1 
4  S36 18 6  0   1 
5  S36 22 7  0   1 
6  W09 45 9  1   0 
inter W09 NA NA 1   0 
inter W09 NA NA 1   0 
inter W09 NA NA 1   0 
7  W09 48 14 0   1 
8  W09 50 15 0   1 

(1) Ich möchte interpolieren und Einsatzwerte an die Orte mit NAs der Fuel and Dist-Spalte. I Behandle die Zeilen mit "inter" zusammen damit Anfangs- und Endzeilen der regulären nummerierten "wpt" als Einheit. Führen Sie dann eine Interpolation durch.

Die erwartete Ausgabe wie folgt ist:

wpt ID Fuel  Dist Express Local 
1  S36 12  1  1   0 
2  S36 14  2  1   0 
inter S36 14.6667 2.67 1   0 
inter S36 15.3333 3.33 1   0 
3  S36 16  4  1   0 
inter S36 17  5  0   1 
4  S36 18  6  0   1 
5  S36 22  7  0   1 
6  W09 45  9  1   0 
inter W09 45.75 10.25 1   0 
inter W09 46.50 11.50 1   0 
inter W09 47.25 12.75 1   0 
7  W09 48  14 0   1 
8  W09 50  15 0   1 

klar, das erste Segment Interpolation werden soll, wie folgt berechnet:

> seq (14,16, length.out = 4)
[1] 14,00000 14,66667 15,33333 16,00000

(2) Dann möchte ich kumulative Summe erhalten jeder Klasse von Express und Local von ID. Die erwartete Ausgabe ist wie folgt:

ID Cumsum.Fuel Cumsum.Dist Express Local 
S36 4    3   1  0 
S36 5    2   0  1 
W09 2.25   3.75  1  0 
W09 2    1   0  1 

Um klar zu sein, Cum.sum.Fuel für "S36" für Express 16-12 = 4 ist. Das Gleiche gilt für andere.

Vielen Dank im Voraus !!!

+0

@akrun, nur hinzugefügt, Entschuldigung für die Verwirrung. –

+0

Ich habe den Beitrag aktualisiert, bitte überprüfen. – akrun

Antwort

1

sowohl die Spalten zu füllen, wir mutate_at nach dem Gruppieren von "ID"

library(dplyr) 
library(zoo) 
df2 <- df1 %>% 
     group_by(ID) %>% 
     mutate_at(vars(Fuel, Dist), na.approx) 
df2 
#  wpt ID  Fuel  Dist Express Local 
# <chr> <chr> <dbl>  <dbl> <int> <int> 
#1  1 S36 12.00000 1.000000  1  0 
#2  2 S36 14.00000 2.000000  1  0 
#3 inter S36 14.66667 2.666667  1  0 
#4 inter S36 15.33333 3.333333  1  0 
#5  3 S36 16.00000 4.000000  1  0 
#6 inter S36 17.00000 5.000000  0  1 
#7  4 S36 18.00000 6.000000  0  1 
#8  5 S36 22.00000 7.000000  0  1 
#9  6 W09 45.00000 9.000000  1  0 
#10 inter W09 45.75000 10.250000  1  0 
#11 inter W09 46.50000 11.500000  1  0 
#12 inter W09 47.25000 12.750000  1  0 
#13  7 W09 48.00000 14.000000  0  1 
#14  8 W09 50.00000 15.000000  0  1 

Für den zweiten Teil verwenden,

library(data.table) 
df2 %>% 
    group_by(ID, Express1 = rleid(Express), Local1 = rleid(Local)) %>% 
    summarise(Express = first(Express), 
      Local = first(Local), 
      Cumsum.Fuel = last(Fuel) - first(Fuel), 
      Cumsum.Dist = last(Dist) - first(Dist)) %>% 
    ungroup() %>% 
    select(-Express1, - Local1) 
#Source: local data frame [4 x 5] 
# ID Express Local Cumsum.Fuel Cumsum.Dist 
# <chr> <int> <int>  <dbl>  <dbl> 
#1 S36  1  0  4.00  3.00 
#2 S36  0  1  5.00  2.00 
#3 W09  1  0  2.25  3.75 
#4 W09  0  1  2.00  1.00 

Oder wir können dies ohne die rleid

tun
df2 %>% 
    group_by(ID, Express, Local) %>% 
    summarise(Cumsum.Fuel = last(Fuel) - first(Fuel), 
       Cumsum.Dist = last(Dist) - first(Dist)) 
+1

Vielen Dank für die Eingabe. Von dir etwas gelernt! Bin dankbar. –

+0

Ich merke, dass ich einen wesentlichen Teil des Problems in diesem Beitrag verpasst habe. Ich habe eine neue Frage erstellt, bitte helfen Sie wenn möglich. –

3

Für die erste Aufgabe können Sie:

library(zoo) 
na.approx(df$Fuel) 
[1] 12.00000 14.00000 14.66667 15.33333 16.00000 17.00000 18.00000 22.00000 45.00000 45.75000 
[11] 46.50000 47.25000 48.00000 50.00000 
+0

Gut zu wissen, diese Funktion! Dann Wie kumulative Summe zu tun .. Ich weiß nicht, wie Sie die Daten unterteilen. Da kann ich nicht einfach per Express und Local gruppieren. Sie sollten als Untereinheit getrennt sein. –

+0

@WhiteBig Ich verstehe nicht ganz, wie Sie diese Summen berechnen. Vielleicht zeigen Sie, wie Sie diese Zahlen in die gewünschte Ausgabe bekommen? – DatamineR

+0

Ja, es ist aktualisiert. Entschuldigung für die Verwirrung. –

Verwandte Themen