web-dev-qa-db-ja.com

「dplyr」ライブラリの「select」関数で一意の値を選択します

selectライブラリのdplyr関数を使用して、data.frameの列からすべての一意値を選択することは可能ですか? SQL表記の「SELECT DISTINCT field1 FROM table1」のようなもの。

ありがとう!

51
Yenici

Dplyr 0.3では、これはdistinct()メソッドを使用して簡単に実現できます。

以下に例を示します。

distinct_df = df %>% distinct(field1)

以下を使用して、個別の値のベクトルを取得できます。

distinct_vector = distinct_df$field1

distinct()呼び出しを実行すると同時に列のサブセットを選択することもできます。これは、head/tail/glimpseを使用してデータフレームを調べると、見やすくなります。

distinct_df = df %>% distinct(field1) %>% select(field1) distinct_vector = distinct_df$field1

85
Ron Gejman

他の回答に追加するために、データフレームではなくベクトルを返す場合は、次のオプションがあります。

dplyr <0.7.

Dplyr関数を括弧で囲み、$構文と組み合わせます。

(mtcars %>% distinct(cyl))$cyl

dplyr> = 0.7.

pull動詞を使用します。

mtcars %>% distinct(cyl) %>% pull()
12
Josh Gilfillan

dplyrselect関数は、データフレームから特定の列を選択します。データの特定の列に一意の値を返すには、group_by関数を使用できます。例えば:

library(dplyr)

# Fake data
set.seed(5)
dat = data.frame(x=sample(1:10,100, replace=TRUE))

# Return the distinct values of x
dat %>%
  group_by(x) %>%
  summarise() 

    x
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10 10

列名を変更する場合は、次を追加できます。

dat %>%
  group_by(x) %>%
  summarise() %>%
  select(unique.x=x)

これは、xが返すデータフレーム内のすべての列から列dplyrを選択し(もちろん、この場合は1列のみです)、名前をunique.xに変更します。

unique(dat$x)を使用して、ベースRで一意の値を直接取得することもできます。

複数の変数があり、データに表示されるすべての一意の組み合わせが必要な場合は、上記のコードを次のように一般化できます。

set.seed(5)
dat = data.frame(x=sample(1:10,100, replace=TRUE), 
                 y=sample(letters[1:5], 100, replace=TRUE))

dat %>% 
  group_by(x,y) %>%
  summarise() %>%
  select(unique.x=x, unique.y=y)
8
eipi10