ホーム>source

SASのマクロと同様のタスクを実行するR関数を記述しようとしています。

  1. プロセス変数
  2. 新しい変数に名前を付ける
  3. 新しいデータフレームに名前を付ける

以下に貼り付けたように、組み込みのdf「iris」とdplyrを使用していくつかの基本的な機能を試しました。

関数f3とf4は、変数名を取り込んで処理しようとします。エラーメッセージは、「エラー:オブジェクト 'Species'が見つかりません」および「mean.default(var):引数が数値または論理ではありません:NAを返します」です。

関数f5およびf6は、新しい変数または新しいdfに名前を付けようとします。関数を実行すると、新しい変数またはdfは引数名にちなんで名付けられました。

f7は関数を使用して変数の一部に名前を付けようとしました。

<前>ウィズウィズ library(dplyr) data(iris) view(iris) ### Char Variable f3 <- function(var){ iris %>% filter(var == "setosa") } f3(Species) f4 <- function(var){ iris %>% summarise( avg = mean(var) ) } f4("Sepal.Length") ### Variable Name f5 <- function(name){ iris %>% mutate(name = 1) } f5("newname") ### df Name f6 <- function(dfname){ dfname <- iris } f6("newdf") f7 <- function(name){ test <- iris %>% mutate( v_name = 1 ) } f7("1")
あなたの答え
  • 解決した方法 # 1

    tidyverse 引用符なしで渡すと、それを定数に変換できます( rlang::enquo )および( !! )、これは {{}} で実行されます  カーリーカーリー演算子

    <前>ウィズウィズ

    ウィズウィズ  引用符で囲まれていない場合も同じように行うことができます

    <前>ウィズウィズ

    引用符付きまたは引用符なしのどちらかを渡すことを意図している場合は、 f3 <- function(var){ iris %>% filter({{var}} == "setosa") } f3(Species) # Sepal.Length Sepal.Width Petal.Length Petal.Width Species #1 5.1 3.5 1.4 0.2 setosa #2 4.9 3.0 1.4 0.2 setosa #3 4.7 3.2 1.3 0.2 setosa #4 4.6 3.1 1.5 0.2 setosa #5 5.0 3.6 1.4 0.2 setosa #... でシンボルに変換します  ( f4

    <前>ウィズウィズ

    f4 <- function(var){ iris %>% summarise( avg = mean({{var}}) ) } f4(Sepal.Length) # avg #1 5.843333 の場合 、 ensym を使用できます

    <前>ウィズウィズ

    または !!

    <前>ウィズウィズ

    注: f4 <- function(var){ iris %>% summarise( avg = mean(!! rlang::ensym(var)) ) } f4(Sepal.Length) # avg #1 5.843333 f4("Sepal.Length") # avg #1 5.843333 を実行する場合  最後のreturnステートメントとして、オブジェクトに割り当てるか、 f7 でラップする必要があります  出力を印刷するには、つまり :=

    ウィズウィズ  ウィズウィズです オブジェクトを使用すると、これは library(stringr) f7 <- function(name){ iris %>% mutate( !!str_c("v_", name) := 1 ) } f7("1") # Sepal.Length Sepal.Width Petal.Length Petal.Width Species v_1 #1 5.1 3.5 1.4 0.2 setosa 1 #2 4.9 3.0 1.4 0.2 setosa 1 #3 4.7 3.2 1.3 0.2 setosa 1 #4 4.6 3.1 1.5 0.2 setosa 1 #... で行うことができます

    <前>ウィズウィズ f5

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ FlutterアプリケーションのinitState中にプロバイダーからのデータを使用する方法