dataframe - ある変数の値の数を別の変数でカウントする変数を R で作成するにはどうすればよいですか?

okwaves2024-01-25  11

これは私のデータです:

    Name          Grade
1     John Smith    C     
2     John Smith    B       
3     John Smith    C      
4     Jane Doe      A     
5     Jane Doe      C     
6     Lisa Brown    B  

これを取得しようとしています:

     Name           A  B  C
1     John Smith    0  1  2
4     Jane Doe      1  0  1  
6     Lisa Brown    0  1  0

テーブルを使用するか、関数を使用して、コンソールでこれをテーブルとして取得できることはわかっていますが、この方法ではデータフレームとして保存されません。何かアイデアはありますか?



------------------------

table() と as.data.frame.matrix() を使用した基本ソリューション。行名を含む data.frame オブジェクトを返します。新しい列として行名を簡単に調整できます。

as.data.frame.matrix(table(df))

#            A B C
# Jane Doe   1 0 1
# John Smith 0 1 2
# Lisa Brown 0 1 0

tidyr から pivot_wider() を 1 回呼び出すだけでこれを実現することもできます。

library(tidyr)

pivot_wider(df, names_from = Grade,
                names_sort = TRUE,
                values_from = Grade,
                values_fill = 0,
                values_fn = length)

# # A tibble: 3 x 4
#   Name           A     B     C
#   <chr>      <int> <int> <int>
# 1 John Smith     0     1     2
# 2 Jane Doe       1     0     1
# 3 Lisa Brown     0     1     0

データ

df <- structure(list(Name = c("John Smith", "John Smith", "John Smith", 
"Jane Doe", "Jane Doe", "Lisa Brown"), Grade = c("C", "B", "C", 
"A", "C", "B")), class = "data.frame", row.names = c(NA, -6L))



------------------------

ここでは 2 つの解決策を示します。

管理者パッケージの tabyl() を使用します。

 library(janitor)

 tabyl(df, name, grade) 

      name A B C
  Jane Doe 1 0 1
John Smith 0 1 2
Lisa Brown 0 1 0

tidyr の pivot_wider() を使用します。 * 注: Darren Tsai の回答からより良い構文で更新されました。

library(tidyr)

df %>%
   pivot_wider(id_cols = name, 
               names_from = grade,
               names_sort = TRUE,
               values_from = grade,
               values_fn = length,
               values_fill = 0) 

 # A tibble: 3 x 4
   name           A     B     C
   <chr>      <dbl> <dbl> <dbl>
 1 John Smith     0     1     2
 2 Jane Doe       1     0     1
 3 Lisa Brown     0     1     0

2020 年 9 月 3 日 16:39 に回答

アンドリュー_リース

アンドリュー_リース

21,000

3 個

金バッジ 3 個

36 個

銀バッジ 36 個

60 個

銅バッジ 60 個

3

こんにちは、あなたの元の pivot_wider() バージョンは私のアイデアとは異なります。ワイドにピボットする前に追加の列を追加しますが、これは私の考えとは異なります。私の承認なしに、私のバージョンをあなたのものとしてコピーすることはできませんよね?

– ダレン・ツァイ

2020 年 9 月 3 日 16:56

こんにちは - 攻撃的な意図はありません。私の経験では、同じメソッド/直感であっても、あなたの方が構文が優れている場合、正しいことは上に置くことですOP がクレジットした回答の構文に日付を記入し、私がクレジットしていることを確認してください。これにより、時間の経過とともに回答がさらに統合されます。実際には別のアプローチを提案しているとは思いません。length をvalues_fn 操作として使用して、count 列を追加する余分な手順をスキップできることを忘れていただけです。異なる意見がある場合は、最初に長さを使用したことを認めるメモとして、このコメントをそのままにしておきます。いいアイデアです!

– アンドリュー・リース

2020 年 9 月 3 日 17:02

新しい列を作成して、pivot_ に value_fn = sum を設定すると思います。Wider() は、values_fn = length を直接設定するのとは考え方が異なります。私の経験では、後者を忘れたかどうかに関係なく、誰かがあなたのコードのより簡潔またはより良いバージョンを提供した場合、そのコードを投稿に残しておくことも削除することもできますが、新しいコードを投稿にコピーしないでください。あなたには「優先権」がありません。

– ダレン・ツァイ

2020 年 9 月 3 日 17:15

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。