1. ホーム
  2. r

dplyr の distinct のカウントを読みやすい方法で取得する

2023-07-13 04:01:35

質問

私はdplyrを使用する新しい人です。 私はグループ内の明確な値を計算する必要があります。これはテーブルの例です。

data=data.frame(aa=c(1,2,3,4,NA), bb=c('a', 'b', 'a', 'c', 'c'))

などができるのは知っています。

by_bb<-group_by(data, bb, add = TRUE)
summarise(by_bb, mean(aa, na.rm=TRUE), max(aa), sum(!is.na(aa)), length(aa))

しかし、私はユニークな要素のカウントが必要な場合?

できるんです。

  > summarise(by_bb,length(unique(unlist(aa))))

  bb length(unique(unlist(aa)))
1  a                          2
2  b                          1
3  c                          2

で、NAを除外したい場合は、そうします。

> summarise(by_bb,length(unique(unlist(aa[!is.na(aa)]))))

  bb length(unique(unlist(aa[!is.na(aa)])))
1  a                                      2
2  b                                      1
3  c                                      1

しかし、それは 私にはちょっと読めません . このような要約をするのに良い方法はないでしょうか?

どのように解決するのですか?

このオプションはどうでしょうか。

data %>%                    # take the data.frame "data"
  filter(!is.na(aa)) %>%    # Using "data", filter out all rows with NAs in aa 
  group_by(bb) %>%          # Then, with the filtered data, group it by "bb"
  summarise(Unique_Elements = n_distinct(aa))   # Now summarise with unique elements per group

#Source: local data frame [3 x 2]
#
#  bb Unique_Elements
#1  a               2
#2  b               1
#3  c               1

使用方法 filter を使うと aa が NA である行をフィルタリングし、次に列でデータをグループ化します。 bb のユニークな要素の数を数えてまとめます。 aa のグループごとに bb .

見ての通り、パイプ演算子を使っています。 %>% これは、dplyrを使用する際にコマンドを一緒に"pipe" または"chain" するために使用することができるものです。これは、より自然であるため、読みやすいコードを書くのに役立ちます。例えば、左から右へ、上から下へとコードを書き、(例のコードのように)内側から外側へと深く入れ子にすることはありません。

編集する

質問の最初の部分で、あなたはこう書きました。

などができることは知っています。

by_bb<-group_by(data, bb, add = TRUE)
summarise(by_bb, mean(aa, na.rm=TRUE), max(aa), sum(!is.na(aa)), length(aa))

ここでは、そのための別のオプション(同じ列(複数可)にいくつもの関数を適用する)を紹介します。

data %>%
  filter(!is.na(aa)) %>%
  group_by(bb) %>%
  summarise_each(funs(mean, max, sum, n_distinct), aa)

#Source: local data frame [3 x 5]
#
#  bb mean max sum n_distinct
#1  a    2   3   4          2
#2  b    2   2   2          1
#3  c    4   4   4          1