裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Re: dplyrでカラム名や値を変数で指定してもうまく認識されない

2022年03月28日 | Julia

dplyrでカラム名や値を変数で指定してもうまく認識されない
https://trunk28.com/dplyr_for/

引用元の記事は 2021/07/11 のものであるが,「dplyrでカラム名や値を変数で指定してもうまく認識されない」ということで,以下のプログラムはエラーになると...

library(dplyr)
hoge <- names(iris)[1]
iris %>% select(hoge)

エラー: Can't subset columns that don't exist.
x Column `hoge` doesn't exist.

しかし,R 4.2.0 では,以下の "Note" が出るが,一応正しい結果が得られる。

Note: Using an external vector in selections is ambiguous.
ℹ Use `all_of(hoge)` instead of `hoge` to silence this message.
ℹ See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
This message is displayed once per session.

解決法として以下のプログラムが提示されているが,.data[[hoge]] のようなわかりにくいものの説明をしている(.data というのは処理中のデータフレームの代名詞だとか)

追記 2022/03/30

中澤先生からのコメントがありました。ありがとうございます。

> hoge <- names(iris)[1]
> iris[,hoge] |> head()
[1] 5.1 4.9 4.7 4.6 5.0 5.4

R"""
library(dplyr)
hoge <- names(iris)[1]
iris %>% select(.data[[hoge]]) %>% head()
"""
RObject{VecSxp}
  Sepal.Length
1          5.1
2          4.9
3          4.7
4          4.6
5          5.0
6          5.4

しかも,select, group_by, summarise, relocate の場合は .data[[hoge]] でよいが,
mutate, transmute では mutate("{hoge2}":=Petal.Length+1) などとしなければならないなど,統一性がない。

正攻法は,警告メッセージにもあるが,all_of(hoge) を使うこと。これならまあ許せる。が,mutate, transmute ではこれも動かない。

R"""
library(dplyr)
hoge <- names(iris)[1]
iris %>% select(all_of(hoge)) %>% head()
"""

"Using an external vector in selections is ambiguous." ということだが,プログラム全体を見渡せば,hoge がカラム名でないことは明らかだと思うがなぁ。

Julia ではなんの問題もなく動く(当たり前だ)。

using DataFrames, RDatasets
iris = dataset("datasets", "iris");

hoge = names(iris)[1]
select(iris, hoge) |> x -> first(x, 5)

select() を使う必然性はまったくなく,iris[:, hoge] で十分。

コメント (2)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Re: Juliaをもっと速くしよう! | トップ | Re. 【R前処理講座19】{dplyr... »
最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
base-R のパイプを使おう (r-de-r)
2022-03-30 08:14:04
できました。
やはり,dplyr はダメダメですね。

Julia でも
iris[:,hoge]
が一番簡単なのですけど,dplyr に似せると記事のようにってしまうのですね。
返信する
Unknown (中澤)
2022-03-29 14:46:41
R-4.1で導入された標準パイプで
iris[,hoge] |> head()
ではダメなんでしょうか
返信する

コメントを投稿

Julia」カテゴリの最新記事