2017-09-09 6 views
3

dplyrと関数を使用して、作成遅れ変数の関数を作成しようとしています。しかし、問題は私がの右側の変数名を引用符で囲まないことを見つけることができないことです。dplyrのmutate関数の右側の変数名を引用符で囲まないでください

mutate(dt, 
    !!varname_t1 := !!varname_t0 # it does not work. 
) 

以下は実際の例です。

A.これは例のデータです。

df <- tibble(
    a = sample(5) 
) 

# A tibble: 5 x 1 
     a 
    <int> 
1  3 
2  5 
3  4 
4  1 
5  2 

このようなデータを作成します。

df <- df %>% mutate(a2 = lag(a1)) 

# A tibble: 5 x 2 
    a1 a2 
    <int> <int> 
1  3 NA 
2  1  3 
3  5  1 
4  2  5 
5  4  2 

B.私は、関数を作成したが、それは動作しません。私は問題がこの行だと思う。右側に、引用符を付ける方法がわかりません。

!!varname_t1 := !!varname_t0 

私の機能は次のとおりです。

lag1_mutate <- function(dt, varname, time) { # time here is "after" 

    # enquo 
    varname <- enquo(varname) 
    time1 <- enquo(time) 
    time0 <- time-1; time0 <- enquo(time0) 

    # create the name of variables 
    varname_t0 <- paste0(quo_name(varname), quo_name(time0)) 
    varname_t1 <- paste0(quo_name(varname), quo_name(time1)) 

    # check 
    print(varname_t0) 
    print(varname_t1) 

    # mutate   
    mutate(dt, 
     !!varname_t1 := !!varname_t0 # <-- problem, here 
     # !!varname_t1 := lag(!!varname_t0) # produced only NAs 
    ) 
} 

実際の結果は次のとおりです。

lag1_mutate(df, a, 2) 

[1] "a1" 
[1] "a2" 
# A tibble: 5 x 2 
     a a2 
    <int> <chr> 
1  4 a1 
2  1 a1 
3  3 a1 
4  2 a1 
5  5 a1 

答えて

3

私はあなたがrlangパッケージからsymで行うことができますquosureにRHSの文字列を変換するために持っていると思います。だから、その後、あなたの関数が

lag1_mutate(df, a, 1) 
# [1] "a0" 
# [1] "a1" 
# # A tibble: 5 x 2 
#  a0 a1 
# <int> <int> 
# 1  3 NA 
# 2  4  3 
# 3  1  4 
# 4  5  1 
# 5  2  5 

を(あなたは、何のシードを設定していないので、私のtibble値はあなたとは異なります。)

+0

ありがとう得られます

mutate(dt, !!varname_t1 := lag(!!rlang::sym(varname_t0))) 

を使用!あなたの答えに基づいて、私は2から10の遅れた変数を作成するために以下のループを作成しました。しかし、動作しません。 "a2"変数ではなく "ai"変数のみを作成し、エラーを出します。関数(DT、VARNAME、時間){varname_t0 < - - paste0(代替 – aasungh

+0

これは 'lag1_mutate <作品 - (I C中の(2:10)){lag1_mutate(DF、I) DF <}の (varname)、time-1); varname_t1 < - paste0(代替(varname)、時間); mutate(dt、!! varname_t1:= lag(!! rlang :: sym(varname_t0)))} '@aasungh – lukeA

+0

これはとてもうまく動作します! :) – aasungh

関連する問題