2017-04-01 25 views
0

データフレームがあります。mutate_atと名前付き匿名関数

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

とカラム上で動作し、ハードコーディングされた列名のC1、C2、パラメータcol例えばから構築された名前を持つC3を置き換えることができますどのようにいくつかの列

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

を返す関数paste0(col, 1)

df %>% ff("x") 

あなたはrename_を利用し、それをあなたが容易に構築することができます名前を渡すことができ

# 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

非dplyr溶液が単に 'DFかもしれない与える< - DF $第X *担当者(2:4、各=長さ( df $ x)) '(これは簡単に関数にラップすることができます) –

答えて

2

とtibbleを返すように

。ここでは、ハードコードされた名前と一致するように名前を設定しています。setNamesを使用して名前を変更します。

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") 

は、あなたが複数の列名を渡した場合、これは失敗すること

# 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 

注意を与えます。これは、単一の列名を渡すときに、名前付き関数の前に列名が既に付加されているためです。あなたは「x」および「y」の両方に合格した場合は、元のff機能でこれを見ることができます:

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

あなたがいることを確実にすることもできますので、この不一致は時折、問題を引き起こす可能性があります

# 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 

を与えます1つの列のみが使用されている場合でも列名を含むように名前を設定することにより、一貫して処理されます。ここでは、それだけで1つの列のみが渡され、それが複数の列が渡されたときに発生する形式に一致するようにそれらを設定します。1列で

​​

されている場合、それはずっと前に(ただし "と同じように機能名をリセット_c」)が含ま:

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

2つのカラムを持つ

 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 

を与え、それが(それがエラーをスローしません)名前だけを残します:

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

は[(1、 "X":3)paste0]

 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