web-dev-qa-db-ja.com

dplyrのピリオド文字「。」とは参照?

期間は何ですか.次のdplyrコードで参照しますか?:

(df <- as.data.frame(matrix(rep(1:5, 5), ncol=5)))
#    V1 V2 V3 V4 V5
#  1  1  1  1  1  1
#  2  2  2  2  2  2
#  3  3  3  3  3  3
#  4  4  4  4  4  4
#  5  5  5  5  5  5

dplyr::mutate_each(df, funs(. == 5))
#       V1    V2    V3    V4    V5
#  1 FALSE FALSE FALSE FALSE FALSE
#  2 FALSE FALSE FALSE FALSE FALSE
#  3 FALSE FALSE FALSE FALSE FALSE
#  4 FALSE FALSE FALSE FALSE FALSE
#  5  TRUE  TRUE  TRUE  TRUE  TRUE

これは「すべての列」の省略形ですか?これは .特定のdplyr構文ですか、それとも一般的なR構文ですか( here で説明)。

また、次のコードでエラーが発生するのはなぜですか?

dplyr::filter(df, . == 5)
#  Error: object '.' not found
19
Megatron

ドットは、mutate_eachsummarise_eachdoの主に(排他的ではなく)dplyr内で使用されます。最初の2つ(および対応するSE)では、funsの関数が適用されるすべての列を指します。 doでは、(潜在的にグループ化された)data.frameを参照するため、.$xyzを使用して "xyz"という名前の列を参照することにより、単一の列を参照できます。

走れない理由

filter(df, . == 5)

これは、a)filterが、たとえばmutate_eachなどの複数の列を処理するように設計されていないことと、b)パイプ演算子%>%を使用する必要があるためです(元々はmagrittrから)。

ただし、パイプ演算子%>%と組み合わせると、rowSums内のfilterなどの関数で使用できます。

> filter(mtcars, rowSums(. > 5) > 4)
Error: Objekt '.' not found

> mtcars %>% filter(rowSums(. > 5) > 4) %>% head()
    lm cyl disp  hp drat    wt  qsec vs am gear carb
1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
3 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
4 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
5 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
6 14.3   8  360 245 3.21 3.570 15.84  0  0    3    4

Magrittrのヘルプファイルも確認してください。

library(magrittr)
help("%>%")

ヘルプページから:

lhsをrhs呼び出しの別の場所に配置する多くの場合、lhsをrhs呼び出しの最初の位置とは別の位置に配置します。この目的のために、プレースホルダーとしてドット(。)を使用できます。たとえば、y %>% f(x, .)f(x, y)と同等であり、z %>% f(x, y, arg = .)f(x, y, arg = z)と同等です。

ドットを二次的な目的で使用する多くの場合、lhs自体の値に加えて、lhs呼び出しでlhsのいくつかの属性またはプロパティが必要です。行または列の数。 rhs呼び出しでドットプレースホルダーを数回使用することは完全に有効ですが、設計により、ネストされた関数呼び出し内で使用する場合の動作は少し異なります。特に、プレースホルダーがネストされた関数呼び出しでのみ使用される場合、lhsも最初の引数として配置されます!これは、ほとんどのユースケースで最も読みやすいコードが生成されるためです。たとえば、iris %>% subset(1:nrow(.) %% 2 == 0)iris %>% subset(., 1:nrow(.) %% 2 == 0)と同等ですが、少しコンパクトです。 rhsを中括弧で囲むことにより、この動作を無効にすることができます。たとえば、1:10 %>% {c(min(.), max(.))}c(min(1:10), max(1:10))と同等です。

18

ドットはfuns内で特別な意味を持っています。そのコンテキストでは、ダミーパラメータを参照します。説明については、_?funs_を参照してください。

funsは、関数のリストを表す_"fun_list"_クラスオブジェクトを作成します。 funsの各引数は、関数名、関数名を表す文字列、または関数の本体を表す式です。最後のケースでは、関数本体を表す式内で、関数の引数はドットで表されるため、_. == 5_は関数function(.) . == 5を参照します(dplyrは実際にはその関数を構築しませんが、代わりに_"fun_list"_オブジェクトを代わりに使用します)。

この例では、_mutate_each_は関数を列ごとに1回実行するため、これは質問と同じことを行いますが、作成された関数ごとに入力を出力します(実際には作成されませんが、それについてそのように)は呼び出されます:

_> out <- mutate_each(df, funs({print(.); . == 5}))
[1] 1 2 3 4 5
[1] 1 2 3 4 5
[1] 1 2 3 4 5
[1] 1 2 3 4 5
[1] 1 2 3 4 5
_

filterの例では、funsは使用されておらず、filterは_"fun_list"_オブジェクトでは機能しません。

ドットは、dplyr内の他のコンテキスト内で他の意味を持ち、他のパッケージの他のコンテキスト内でも他の意味を持つことができます。

5
G. Grothendieck