2016-11-14 6 views
0

Für solche data.frame verwenden top_n ich eine Funktion machen möchten, dass die 5 größten Beobachtungen von ausgewählten Variablen zurück:Wie in R-Funktion

df1 <- structure(list(Yta = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L 
), Rad = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Planta = c(1L, 
2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L), Sortnr = c(8213L, 513L, 
8060L, 8093L, 2131L, 8200L, 2378L, 8135L, 8156L, 8256L), Dia12 = c(53L, 
29L, NA, NA, 53L, 6L, 20L, NA, 13L, 20L), Dia34 = c(177L, 39L, 
NA, NA, 0L, 77L, 101L, NA, 77L, 95L), Vit34 = c(2L, 1L, NA, NA, 
2L, 1L, 2L, NA, 1L, 1L), Ska1 = c(NA, 542L, NA, NA, 634L, NA, 
NA, NA, NA, NA), Ska2 = c(NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_), Dia34_2 = c(NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_), block1 = c(1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L), block = c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L), x = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2), y = c(1, 
2, 3, 4, 5, 6, 1, 2, 3, 4), id = c("1:1:1", "1:1:2", "1:1:3", 
"1:1:4", "1:1:5", "1:1:6", "1:2:1", "1:2:2", "1:2:3", "1:2:4" 
)), .Names = c("Yta", "Rad", "Planta", "Sortnr", "Dia12", "Dia34", 
"Vit34", "Ska1", "Ska2", "Dia34_2", "block1", "block", "x", "y", 
"id"), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame" 
)) 

Ich möchte dplyr verwenden, wie ich es mag! Ich habe eine solche Funktion versucht, aber mit dem Fehler! Ich gues das Ding ist mit dem dritten Argument der Funktion, die nicht erkannt wird. Wurde für einen Tipp dankbar sein, wie dieses Problem

prMval <- function(df, sort, varia){ 
    df %>% #filter(Sortnr == sort) %>% 
    #filter(!(Rad %in% c(min(Rad), max(Rad))) & !(Planta %in% c(min(Planta), max(Planta)))) %>% 
    top_n(5, varia) 
} 

prMval(df1, 2, Dia34) 


Error: object 'varia' not found 
+0

das zweite Argument zu top_n() ist ein numerisches Recht. daher muss es df $ Dia34 ODER innerhalb der Funktion verwenden df [[Dia34]] aber dann prMval (df, 2, "Dia34") –

+0

Ich bekomme keinen Fehler, wenn ich Ihren Code ausführen, es gibt nur eine zurück leerer tibble Datenrahmen für mich. –

+0

versuche es jetzt, ich musste einige Beobachtungen im Datenrahmen, so dass der Filter alle Beobachtung – Mateusz1981

Antwort

1

zu überwinden Bei der Verwendung von top_n es für die Variable „varia“ als eine Spalte in der Eingabe sieht, interpretiert es nicht varia. Durch die Verwendung des lazyeval Paket können wir sicherstellen, varia vor top_n interpretiert wird:

library(lazyeval) 
prMval <- function(df, sort, varia){ 
    tmp <- df #%>% filter(Sortnr == sort) %>% 
    #filter(!(Rad %in% c(min(Rad), max(Rad))) & !(Planta %in% c(min(Planta), max(Planta)))) 

    lazy_eval(interp(~top_n(tmp, 5, varia), varia = as.name(varia))) 
    # Replace varia with the input and then interpret the resulting call 
} 

prMval(df1, 2, "Dia34") # Make sure to pass a character string as varia 

, die zurückgibt:

# A tibble: 5 x 15 
    Yta Rad Planta Sortnr Dia12 Dia34 Vit34 Ska1 Ska2 Dia34_2 block1 block  x  y id 
    <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <dbl> <dbl> <chr> 
1  1  1  1 8213 53 177  2 NA NA  NA  1  1  1  1 1:1:1 
2  1  1  6 8200  6 77  1 NA NA  NA  1  1  1  6 1:1:6 
3  1  2  1 2378 20 101  2 NA NA  NA  1  1  2  1 1:2:1 
4  1  2  3 8156 13 77  1 NA NA  NA  1  1  2  3 1:2:3 
5  1  2  4 8256 20 95  1 NA NA  NA  1  1  2  4 1:2:4 

Ich habe nicht herausgefunden, wie dies obwohl in der Pipeline zu tun, so dass ich trennte die Schritte.

Verwandte Themen