web-dev-qa-db-ja.com

Rのデータフレーム内のエントリの数

次のデータフレームのカウントを取得しようとしています。

> Santa
   Believe Age Gender Presents Behaviour
1    FALSE   9   male       25   naughty
2     TRUE   5   male       20      Nice
3     TRUE   4 female       30      Nice
4     TRUE   4   male       34   naughty

信じている子供の数の。これを取得するにはどのコマンドを使用しますか?

(実際のデータフレームははるかに大きくなります。最初の4行を指定しました...)

ありがとう!

24
Michael

tableを使用できます:

R> x <- read.table(textConnection('
   Believe Age Gender Presents Behaviour
1    FALSE   9   male       25   naughty
2     TRUE   5   male       20      Nice
3     TRUE   4 female       30      Nice
4     TRUE   4   male       34   naughty'
), header=TRUE)

R> table(x$Believe)

FALSE  TRUE 
    1     3 
38
rcs

私はこれを2段階のプロセスと考えています:

  1. 指定されたフィルター(Believe == FALSE)に従って元のデータフレームをサブセット化します。それから

  2. このサブセットの行数を取得します

最初のステップでは、subset関数がこれを行うための良い方法です(通常のインデックスまたはブラケットの代わりにすぎません) 表記)。

2番目のステップでは、dimまたはnrowを使用します

subsetを使用する1つの利点:必要な結果を取得するために返される結果を解析する必要はありません-nrowその上に直接。

あなたの場合:

v = nrow(subset(Santa, Believe==FALSE))     # 'subset' returns a data.frame

または、匿名関数でラップされます

>> fnx = function(fac, lev){nrow(subset(Santa, fac==lev))}

>> fnx(Believe, TRUE)
      3

nrow以外に、dimも仕事をします。この関数は、データフレーム(行、列)のdimensionsを返すため、行数にアクセスするには適切なインデックスを指定するだけです。

v = dim(subset(Santa, Believe==FALSE))[1] 

この前に投稿されたOPへの回答は、分割表の使用を示しています。 OPに記載されている一般的な問題に対するこのアプローチは好きではありません。これが理由です。確かに、このデータフレームの列Cに値xを持つ行の数の一般的な問題は?分割表と「フィルタリング」スキーム(ここでの私の答えで)。特定の因子変数(列)のすべての値の行カウントが必要な場合は、(tableを呼び出して目的の列を渡すことによる)分割表が最も多くなります賢明な解決策;ただし、OPは、すべての値のカウントではなく、因子変数のparticular値のカウントを要求します。パフォーマンスヒットは別として(大きくなる可能性があり、些細なことかもしれませんが、データフレームのサイズと、この関数が存在する処理パイプラインコンテキストにのみ依存します)。そしてもちろん、テーブルへの呼び出しからの結果が返されたら、その結果から必要なカウントだけをparseする必要があります。

だから、私にとって、これはクロスタブの問題ではなくフィルタリングです。

23
doug
sum(Santa$Believe)
14
Carl

summary(santa$Believe)を実行すると、TRUEおよびFALSEのカウントを取得できます。

2
Brenda D'Acunha

DPLYRはこれを本当に簡単にします。

x<-santa%>%
   count(Believe)

グループごとにカウントしたい場合;たとえば、男性と女性が何人信じているか、group_by

x<-santa%>%
   group_by(Gender)%>%
   count(Believe)
1
Joe

one-linedata.tableのソリューションは

library(data.table)
setDT(x)[,.N,by=Believe]
   Believe N
1:   FALSE 1
2:    TRUE 3
0
Chriss Paul

sqldfを使用すると、ここに収まります。

library(sqldf)
sqldf("SELECT Believe, Count(1) as N FROM Santa
       GROUP BY Believe")
0
OmG