2017-04-21 13 views
2

は、データがあることしてみましょう:データセット内の変数を関数の引数として使用できますか?

> dput(df) 
structure(list(NAME.x = c("ANNE", "BOB", "CATHY", "DIANNE", "EMILY" 
), NAME.y = c(NA, "BOB", "CATHY", "DIANNE", NA), AGE.x = c("81", 
"47", "47", "47", "37"), AGE.y = c(NA, "47", "47", "47", NA), 
    ADMISSIONDATE.x = structure(c(1380751296, 1382088000, 1382088000, 
    1382088000, 1383207720), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    ADMISSIONDATE.y = structure(c(NA, 1382088000, 1382088000, 
    1382088000, NA), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    DISCHARGEDDATE.x = structure(c(1381172735, 1382189165, 1382189165, 
    1382189165, 1383250549), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    DISCHARGEDDATE.y = structure(c(NA, 1382189165, 1382189165, 
    1382189165, NA), class = c("POSIXct", "POSIXt"), tzone = "UTC")), row.names = c(NA, 
-5L), .Names = c("NAME.x", "NAME.y", "AGE.x", "AGE.y", "ADMISSIONDATE.x", 
"ADMISSIONDATE.y", "DISCHARGEDDATE.x", "DISCHARGEDDATE.y"), class = "data.frame") 

私は類似して、このデータセットで共通の変数の違いをチェックしたいと思います。私は3つの引数がデータセットであり、データセットの2つの変数がある関数を作成しようとしました。

check<-function(data,var1,var2){ 
    # X1: x and y are equal 
    # X2: x and y are not equal 
    # Y1: x and y are non-empty 
    # Y2: x and y are empty 
    # Z1: x is non-empty and y is empty 
    # Z2: x is empty and y is non-empty 
    cnt_each<-data %>% 
     mutate(X1 = (var1==var2), 
      X2 = (var1!=var2), 
      Y1 = (!is.na(var1) & !is.na(var2)), 
      Y2 = (is.na(var1) & is.na(var2)), 
      Z1 = (!is.na(var1) & is.na(var2)), 
      Z2 = (is.na(var1) & !is.na(var2))) %>% 
     summarise_at("X1:Z2",funs(sum(.))) %>% 
     mutate(sum_all=sum(.,na.rm=TRUE)) 
    return(cnt_each) 
    } 

ただし、実行中にエラーが発生します。関数外でコードを実行するとエラーは発生しません。 mutate_impl(.dataの、ドット)で

check(df,NAME.x,NAME.y) 

エラー:オブジェクトは 'NAME.x'

+2

ため(!!又はUQ)引用符で囲まれていないいます。 – zx8754

+2

[こちらをご覧ください](http://stackoverflow.com/questions/27975124/pass-arguments-to-dplyr-functions) – Sotos

答えて

2

我々はdplyrのdevelのバージョンを利用することができます(まもなくリリースされる0.6.0が見つかりませんこれを行う)。 enquoは入力引数をとり、quosureに変換します。 mutate/summarise/group_by内、quosuresは、列名などの文字列を渡す `mutate_`を見る評価

check<-function(data,var1,var2){ 
    var1 <- enquo(var1) 
    var2 <- enquo(var2) 
    data %>% 
     mutate(X1 = UQ(var1)==UQ(var2), 
       X2 = UQ(var1) != UQ(var2), 
       Y1 = !is.na(UQ(var1)) & !is.na(UQ(var2)), 
       Y2 = is.na(UQ(var1)) & is.na(UQ(var2)), 
       Z1 = !is.na(UQ(var1)) & !is.na(UQ(var2)), 
       Z2 = is.na(UQ(var1)) & !is.na(UQ(var2))) %>% 
     summarise_at(vars(X1:Z2), funs(sum(., na.rm = TRUE))) %>% 
     mutate(sum_all = rowSums(., na.rm = TRUE)) 

}  


check(df, NAME.x, NAME.y) 
# X1 X2 Y1 Y2 Z1 Z2 sum_all 
#1 3 0 3 0 3 0  9 
+0

したがって、 'enquo'と' UQ'の両方が 'dplyr'の新バージョンになりますか? – HNSKD

+1

@HNSKDはい、 'quo_name'や' !!! '、 'quo'や' quos'などの他のものと一緒になります。 – akrun

+0

'xxx_'のようなものは次のバージョンで廃止されますか? – zx8754

関連する問題