期間は何ですか.
次の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
ドットは、mutate_each
、summarise_each
、do
の主に(排他的ではなく)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))
と同等です。
ドットは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内の他のコンテキスト内で他の意味を持ち、他のパッケージの他のコンテキスト内でも他の意味を持つことができます。