5

私は R を独学で学んでおり、これが StackOverflow に関する最初の質問です。これが明らかな問題である場合はお詫び申し上げます。親切にしてください。

私の質問の簡単なバージョン
変数の年々の変化率を計算するカスタム関数を作成しました。purrrmap_at関数を使用して、カスタム関数を変数名のベクトルに適用したいと考えています。カスタム関数は、単一の変数に適用すると機能しますが、次を使用してチェーンすると失敗しますmap_a

私のカスタム関数

calculate_delta <- function(df, col) {

  #generate variable name
  newcolname = paste("d", col, sep="")

  #get formula for first difference.
  calculate_diff <- lazyeval::interp(~(a + lag(a))/a, a = as.name(col))

  #pass formula to mutate, name new variable the columname generated above
  df %>% 
        mutate_(.dots = setNames(list(calculate_diff), newcolname)) }

この関数を mtcars データセット内の単一の変数に適用すると、出力は期待どおりになります (ただし、結果の意味は明らかに無意味です)。

calculate_delta(mtcars, "wt")

Purrr を使用して関数を文字ベクトルに適用する試み

map_at が引数を関数に渡す方法を概念化するのに問題があると思います。私がオンラインで見つけることができるすべてのサンプル スニペットはis.character、追加の引数を必要としない のような関数で map_at を使用しています。を使用して関数を適用する私の試みは次のとおりpurrrです。

vars <- c("wt", "mpg")
mtcars %>% map_at(vars, calculate_delta)

これにより、このエラーメッセージが表示されます

paste("d", col, sep = "") のエラー: 引数 "col" がありません。デフォルトはありません

これは、 map_at が として渡さvarsれ、dfの引数が渡されていないためだと思いますcol。この問題を回避するために、次のことを試しました。

vars <- c("wt", "mpg") 
mtcars %>% map_at(vars, calculate_delta, df = .)

それは私にこのエラーをスローします:

Error: unrecognised index type

関数dfから引数を削除するなど、さまざまなバージョンを試してみましたが、うまくいきませんでした。calculate_delta

その他の潜在的な解決策

sapply1)ではなくを使用したバージョンpurrr。私はその方法で問題を解決しようとしましたが、同様の問題がありました。私の目標は、可能であれば、purrr を使用してこれを行う方法を見つけることです。の私の理解に基づくとpurrr、これは典型的な使用例のようです。

2)forループを使用してこれを実装する方法を明らかに考えることができますが、同様の理由で可能であればそれを避けようとしています。

明らかに、私はこれについて間違って考えています。助けてください!

編集1

明確にするために、2つのことを達成する変数を繰り返し変換する方法があるかどうかに興味があります。

tbl_df1) 変更された列を置換せずに、元の変数内に新しい変数を生成します ( を使用する場合dplyrの ようにmutate_at)。

2) 新しい変数ラベルを自動的に生成します。

3) 可能であれば、map_at.

これは不可能かもしれませんが、私が説明していることを達成するためのエレガントな方法があるべきだと思います.

4

1 に答える 1

10

プロセスを簡素化してみてください。

delta <- function(x) (x + dplyr::lag(x)) /x
cols <- c("wt", "mpg")

#This
library(dplyr)
mtcars %>% mutate_at(cols, delta)
#Or
library(purrr)
mtcars %>% map_at(cols, delta)

#If necessary, in a function
f <- function(df, cols) {
  df %>% mutate_at(cols, delta)
}

f(iris, c("Sepal.Width", "Petal.Length"))
f(mtcars, c("wt", "mpg"))

編集

後で新しい名前を埋め込みたい場合は、パイプ対応のカスタム関数を作成できます。

Rename <- function(object, old, new) {
  names(object)[names(object) %in% old] <- new
  object
}

mtcars %>% 
  mutate_at(cols, delta) %>% 
  Rename(cols, paste0("lagged",cols))

結果のラグ変数の名前を変更する場合:

mtcars %>% mutate_at(cols, funs(lagged = delta))
于 2016-08-30T04:23:26.150 に答える