2017-05-13 24 views
1

Angenommen, die folgenden Daten:lineare Interpolation durch Gruppe in R

 Date  V1    V2 
1 1996-01-04 0.04383562 days 0.1203920 
2 1996-01-04 0.12054795 days 0.1094760 
.............. 
3 1996-02-01 0.04383562 days 0.1081815 
4 1996-02-01 0.12054795 days 0.1092450 
.............. 
5 1996-03-01 0.04109589 days 0.1553875 
6 1996-03-01 0.13687215 days 0.1469690 

Für jede der Gruppendaten (was ich sie für eine einfache durch Punkte zu unterscheiden), ich möchte eine einfache lineare Interpolation tun: für eine V1=0.08 was V2 ich werde bekommen.

Was ich versucht habe: zuerst die logischste Ansatz zu verwenden approx:

IV<-data %>% group_by(Date) %>% approx(V1,V2,xout=0.08) 

sondern bekomme ich diesen Fehler:

Error in approx(., V1, V2, xout = 0.08) : 
    invalid interpolation method 
In addition: Warning message: 
In if (is.na(method)) stop("invalid interpolation method") : 
    the condition has length > 1 and only the first element will be used 

dann habe ich versucht:

Results<-unsplit(lapply(split(data,data$Date),function(x){m<-lm(V2~V1,x) 
                 cbind(x,predict(m,0.08))}),data$Date) 

mit einem Fehler:

Error in model.frame.default(formula = x[, 3] ~ x[, 2], data = x, drop.unused.levels = TRUE) : 
    invalid type (list) for variable 'x[, 3]' 

Ich habe auch versucht die dplyr Paket ohne Ergebnisse:

IV<-data %>% group_by(Date) %>% predict(lm(V2~V1,data=data,0.08) 

, die den Fehler gab:

Error in UseMethod("predict") : 
    no applicable method for 'predict' applied to an object of class "c('grouped_df', 'tbl_df', 'tbl', 'data.frame')" 

Danke.

Antwort

2

Der Fehler, den Sie in approx erhalten haben, liegt daran, dass Sie das data.frame als erstes Argument übergeben, wenn Sie %>% verwenden. Also ist Ihr Anruf approx(df, v1, v2, xout=0.08).

Sie könnten den approx Anruf erreichen data.table in einem Einzeiler mit:

library(data.table) 
#created as df instead of dt for use in dplyr solution later 
df <- data.frame(grp=sample(letters[1:2],10,T), 
      v1=rnorm(10), 
      v2=rnorm(10)) 

dt <- data.table(df) 

dt[, approx(v1,v2,xout=.08), by=grp] 

#output 
    grp x   y 
1: b 0.08 -0.5112237 
2: a 0.08 -1.4228923 

Auf einem ersten Durchgang in der tidyverse meine Lösung ist nicht zu bleiben, so aufgeräumt; es gibt wahrscheinlich einen saubereren Weg, dies in einer Pipeline zu tun, aber ich denke, es wird schwer sein, die data.table Lösung zu schlagen.

Lösung in magrittr Pipeline gezwungen:

library(dplyr) 

df %>% 
    group_by(grp) %>% 
    summarise(out=list(approx(v1,v2,xout=.08))) %>% 
    ungroup() %>% 
    mutate(x=purrr::map_dbl(out,'x'), 
      y=purrr::map_dbl(out,'y')) %>% 
    select(-out) 

#output 
# A tibble: 2 × 3 
    grp  x   y 
    <fctr> <dbl>  <dbl> 
1  a 0.08 -1.4228923 
2  b 0.08 -0.5112237 
+0

Sorry für die späte Antwort, aber ca. nicht gut funktioniert (gibt NA), wenn ich extrapolieren, ist das richtig? Es funktioniert perfekt für den Interpolationsteil. –