2016-03-21 15 views
3

Ich habe ein data.frame wie so:R: expand data.frame Werte

df <- data.frame(x = c(998,994,992,990,989,988), y = seq(0.5, 3, by = 0.5)) 
df 

    x y 
1 998 0.5 
2 994 1.0 
3 992 1.5 
4 990 2.0 
5 989 2.5 
6 988 3.0 

Ich möchte um es zu erweitern, so dass die Werte in x genau 1 auseinander, so dass die endgültige data.frame wie folgt aussieht:

x y 
1 998 0.5 
2 997 0.5 
3 996 0.5 
5 995 0.5 
6 994 1.0 
7 993 1.0 
8 992 1.5 
9 991 1.5 
10 990 2.0 
11 989 2.5 
12 988 3.0 
+0

der Suche nach einer generischen Lösung oder für dieses spezielle Problem? – rbm

+0

@rbm, generische wäre ideal, aber wenn nur für diesen speziellen Fall kann ich damit für jetzt arbeiten. – cdeterman

Antwort

7

Sie können mit der Funktion versuchen na.locf von Paket zoo:

all_values <- max(df$x):min(df$x) 
na.locf(merge(df, x=all_values, all=TRUE)[rev(seq(all_values)),]) 
#  x y 
# 11 998 0.5 
# 10 997 0.5 
# 9 996 0.5 
# 8 995 0.5 
# 7 994 1.0 
# 6 993 1.0 
# 5 992 1.5 
# 4 991 1.5 
# 3 990 2.0 
# 2 989 2.5 
# 1 988 3.0 

NB

Wie @Ananta und @ProcrastinatusMaximus vorgeschlagen, ist eine weitere Option fromLast=TRUE im na.locf Aufruf setzen (wenn Sie x haben müssen, in absteigender Reihenfolge, Sie werden die data.frame danach sortieren müssen):

na.locf(merge(df, x=all_values, all=TRUE), fromLast=TRUE) 
+1

oder 'na.locf (Zusammenführen (df, x = max (df $ x): min (df $ x), alle = TRUE), fromLast = T)' anstelle von 'rev' – Ananta

+0

@Ananta, in der Tat, danke für der Kommentar, obwohl, um die genaue Ausgabe zu erhalten, muss der df immer noch "umgekehrt" sein ... – Cath

+1

Das macht den Trick, danke – cdeterman

11

Sie auch approx verwenden können:

data.frame(approx(df, xout=max(df$x):min(df$x), method="constant", f=1)) 

    x y 
1 998 0.5 
2 997 0.5 
3 996 0.5 
4 995 0.5 
5 994 1.0 
6 993 1.0 
7 992 1.5 
8 991 1.5 
9 990 2.0 
10 989 2.5 
11 988 3.0 
Verwandte Themen