2017-04-01 2 views
0

Wir haben einen Datenrahmen.mutate_at mit benannten anonymen Funktionen

df <- data_frame(x = 1:5, y = 101:105) 

und eine Funktion, die auf einer Säule arbeitet und gibt mehrere Spalten

ff <- function(df, col) df %>% 
     mutate_at(col, funs(c1 = .*2, c2 = .*3, c3 = .*4)) 

Wie fest einprogrammierte Spaltennamen ersetzen kann c1, c2, c3 mit Namen aus dem Parameter konstruiert col z.B. paste0(col, 1).

so dass

df %>% ff("x") 

gibt einen tibble mit

# A tibble: 10 × 5 
     x  y x1 x2 x3 
    <int> <int> <dbl> <dbl> <dbl> 
1  1 100  2  3  4 
2  2 101  4  6  8 
3  3 102  6  9 12 
4  4 103  8 12 16 
5  5 104 10 15 20 
+1

Nicht dplyr Lösung einfach 'df sein könnte [paste0 ("x", 1: 3)] <- df $ x * rep (2: 4, die jeweils = Länge (df $ x)) '(das könnte leicht in eine Funktion verpackt werden) –

Antwort

2

Sie Vorteil von rename_ nehmen und es Namen übergeben, die Sie leicht konstruieren können. Hier stelle ich die Namen so ein, dass sie den hartcodierten Namen unter Verwendung von setNames entsprechen, und benenne sie dann einfach um.

updatedFF <- function(df, col){ 
    colNames <- 
    setNames(
     paste0("c", 1:3) 
     , paste0(col, 1:3)) 

    df %>% 
    mutate_at(col, funs(c1 = .*2, c2 = .*3, c3 = .*4)) %>% 
    rename_(.dots = colNames) 
} 

df %>% updatedFF("x") 

gibt

# A tibble: 5 × 5 
     x  y x1 x2 x3 
    <int> <int> <dbl> <dbl> <dbl> 
1  1 101  2  3  4 
2  2 102  4  6  8 
3  3 103  6  9 12 
4  4 104  8 12 16 
5  5 105 10 15 20 

Hinweis, dass dies fehlschlagen, wenn Sie in mehr als einem Spaltennamen übergeben. Wenn Sie nämlich einen einzelnen Spaltennamen übergeben, wird den benannten Funktionen bereits der Spaltenname vorangestellt. Sie können dies in Ihrer ursprünglichen ff Funktion sehen, wenn Sie beide „x“ übergeben und „y“:

df %>% ff(c("x", "y")) 

gibt

# A tibble: 5 × 8 
     x  y x_c1 y_c1 x_c2 y_c2 x_c3 y_c3 
    <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
1  1 101  2 202  3 303  4 404 
2  2 102  4 204  6 306  8 408 
3  3 103  6 206  9 309 12 412 
4  4 104  8 208 12 312 16 416 
5  5 105 10 210 15 315 20 420 

Diese Diskrepanz kann gelegentlich zu Problemen führen, so dass Sie sicherstellen wollen, dass Es wird konsistent gehandhabt, indem die Namen so festgelegt werden, dass der Spaltenname enthalten ist, auch wenn nur eine Spalte verwendet wird. Hier setzt er nur Namen, wenn nur eine Spalte übergeben wird und es setzt sie das Format anzupassen, das auftritt, wenn mehrere Spalten übergeben werden.

moreComplexFF <- function(df, col){ 
    if(length(col) == 1){ 
    colNames <- 
     setNames(
     paste0("c", 1:3) 
     , paste0(col, "_c", 1:3)) 
    } else{ 
    colNames = NULL 
    } 

    df %>% 
    mutate_at(col, funs(c1 = .*2, c2 = .*3, c3 = .*4)) %>% 
    rename_(.dots = colNames) 
} 

Mit einer Spalte, es funktioniert ähnlich wie vor (wenn auch mit dem " _c“enthalten):

df %>% moreComplexFF(c("x")) 

 x  y x_c1 x_c2 x_c3 
    <int> <int> <dbl> <dbl> <dbl> 
1  1 101  2  3  4 
2  2 102  4  6  8 
3  3 103  6  9 12 
4  4 104  8 12 16 
5  5 105 10 15 20 

Mit zwei Spalten gibt, lässt er die allein Namen (so dass es nicht einen Fehler melden):

df %>% moreComplexFF(c("x", "y")) 

gibt

 x  y x_c1 y_c1 x_c2 y_c2 x_c3 y_c3 
    <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
1  1 101  2 202  3 303  4 404 
2  2 102  4 204  6 306  8 408 
3  3 103  6 206  9 309 12 412 
4  4 104  8 208 12 312 16 416 
5  5 105 10 210 15 315 20 420 
Verwandte Themen