2017-04-16 4 views
4

R Markdownファイルで使用する複数のデータ列の報告を高速化する簡単な集計関数を作成しようとしています。列名を関数dplyrに渡す方法

var1はデータのカテゴリ列、t_varはデータの四半期を表す整数、dtは完全なデータです。

summarise_data_categorical <- function(var1, t_var, dt){ 

    print(var1) 
    print(t_var) 

    #Select the columns to aggregate 
    group_func <- dt %>% 
    select(one_of(t_var, var1)) %>% 
    group_by(t_var,var1) 

    #create simple count summary 
    count_table <- group_func %>% 
    summarise(count = n()) %>% 
    spread(t_var, count) 

    #create a frequency version of the same table... 
    freq <- dt %>% 
    select(t_var, var1) %>% 
    group_by(t_var,var1) %>% 
    summarise(count = n()) %>% 
    mutate(freq = round(count/sum(count),3)*100) %>% 
    select(-count) 

    #Present that table 
    freq_table <- freq %>% 
    spread(t_var, freq) 

    #Create the chart to do the same thing.. 
    freq_chart <- freq %>% 
    ggplot()+ 
    geom_line(mapping=aes(x=t_var, y = freq, colour=var1)) 

    #Compile outputs as a list 
    results <- list(count_table, freq_table, freq_chart) 

    #Return list 
    results 

} 

私はフレームを持って言う:

fr <- data.frame(lets = sample(LETTERS, 100, replace=TRUE), 
      `quarter type` = sample(1:4, 100, replace=TRUE)) 

私はこのように、関数を実行した場合:

summarise_data_categorical("lets", "quarter type", fr) 

初期出力が有望である:

[1] "lets" 
[1] "quarter type" 

(注:データを再作成しようとすると、何らかの理由で私はこれは私の元のデータには表示されませんが、主なものは、私はエラーを取得する場合)

quarter type、 :

Error in resolve_vars(new_groups, tbl_vars(.data)) : unknown variable to group by : t_var 

は、Pythonから来た

不明な変数:LSO警告を受けます、私はまだ列を参照する方法について少し混乱しています。誰かが私が間違っていることをどのように修正できるか説明することができますか?

+0

ではなく、完全なコードの最小限の機能を表示してください完全なコードのために働く必要があります。他人がテストするのが楽になります – akrun

+0

@akrun、ありがとうございました。 – elksie5000

答えて

5

私たちは、入力引数を取ることによって

summarise_data_categorical <- function(var1, t_var, dt){ 

    var1 <- enquo(var1) 
    t_var <- enquo(t_var) 
    v1 <- quo_name(var1) 
    v2 <- quo_name(t_var) 

    dt %>% 
    select(one_of(v1, v2)) %>% 
    group_by(!!t_var, !!var1) %>% 
    summarise(count = n()) 

} 
summarise_data_categorical(lets, quartertype, fr) 
#Source: local data frame [65 x 3] 
#Groups: quartertype [?] 

# quartertype lets count 
#   <int> <fctr> <int> 
#1   1  A  1 
#2   1  F  2 
#3   1  G  2 
#4   1  H  1 
#5   1  I  1 
#6   1  J  4 
#7   1  M  3 
#8   1  N  1 
#9   1  P  1 
#10   1  S  5 
# ... with 55 more rows 

enquobase Rからsubstituteと同様の機能を行います(すぐに0.6.0にリリースされる)dplyrのdevelのバージョンから新しいquosuresを使用して変換することができますそれはquosuresになります。 one_ofは文字列引数を取るため、querをquo_nameという文字列に変換できます。我々はtidyrの機能と同じように実装する際にいくつかの困難を持っているもののgroup_by/summarise/mutateなどの内部では、我々は(UQまたは!!)にunquote


でquosureを評価することができquosuresdplyrで正常に動作しているようです。次のコードは、

summarise_data_categorical <- function(var1, t_var, dt){ 

    var1 <- enquo(var1) 
    t_var <- enquo(t_var) 

    v1 <- quo_name(var1) 
    v2 <- quo_name(t_var) 

    Summ_func <- dt %>% 
        select(one_of(v1, v2)) %>% 
        group_by(!!t_var, !!var1) %>% 
        summarise(count = n()) 

    count_table <- Summ_func %>% 
        spread_(v2, "count") 

    freq <- Summ_func %>% 
        mutate(freq = round(count/sum(count),3)*100) %>% 
       select(-count) 

    freq_table <- freq %>% 
        spread_(v2, "freq") 

    freq_chart <- freq %>% 
      ggplot()+ 
       geom_line(mapping=aes_string(x= v2 , y = "freq", colour= v1)) 

    results <- list(count_table, freq_table, freq_chart) 
    results 

    } 
summarise_data_categorical(lets, quartertype, fr) 
#[[1]] 
# A tibble: 24 × 5 
#  lets `1` `2` `3` `4` 
#* <fctr> <int> <int> <int> <int> 
#1  A NA NA  1  2 
#2  B  2 NA NA  1 
#3  C  1  5  1  2 
#4  E  1  1 NA NA 
#5  G NA  1  2  2 
#6  H  1 NA  1  1 
#7  I NA  1  1  2 
#8  J  2  1  1  1 
#9  K  1  1  2  1 
#10  L NA  2 NA NA 
# ... with 14 more rows 

#[[2]] 
# A tibble: 24 × 5 
#  lets `1` `2` `3` `4` 
#* <fctr> <dbl> <dbl> <dbl> <dbl> 
#1  A NA NA 3.1 9.5 
#2  B 8.7 NA NA 4.8 
#3  C 4.3 20.8 3.1 9.5 
#4  E 4.3 4.2 NA NA 
#5  G NA 4.2 6.2 9.5 
#6  H 4.3 NA 3.1 4.8 
#7  I NA 4.2 3.1 9.5 
#8  J 8.7 4.2 3.1 4.8 
#9  K 4.3 4.2 6.2 4.8 
#10  L NA 8.3 NA NA 
## ... with 14 more rows 

#[[3]] 

enter image description here

+1

私はあなたの助けと説明を感謝します。迅速な返信ありがとうございました。私はRに約3週間居ますが、それでも私の心は吹いています。 :) – elksie5000

+1

@ elksie5000完全なコード – akrun

+1

で投稿を更新しました。これは素晴らしいことです。私はquosuresについて聞いたことはありません - ここに誰もいない人のための素晴らしいリファレンスです:http://rstudio-pubs-static.s3.amazonaws.com/260900_eed544dc1f504bffb4521913eb2da86e.html – elksie5000