質問
次のデータフレームのカウントを取得しようとしています:
> 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行を指定しました...)
ありがとう!
解決
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
他のヒント
これを2段階のプロセスと考えています:
-
指定されたフィルターに従って元のデータフレームをサブセット化 (Believe == FALSE);その後
-
このサブセットの行数を取得
最初のステップでは、 サブセット 関数がこれを行うための良い方法です(通常のインデックスまたは大括弧表記の代わりになります) 。
2番目のステップでは、 dim または nrow
を使用しますサブセットを使用する利点の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は、すべての値のカウントではなく、因子変数の特定の値のカウントを要求します。パフォーマンスヒットは別として(大きくなる可能性があり、些細なことかもしれませんが、データフレームのサイズと、この関数が存在する処理パイプラインコンテキストにのみ依存します)。そしてもちろん、テーブルの呼び出しから結果が返されたら、その結果から必要な数だけを解析する必要があります。
だから、私にとってこれはクロスタブの問題ではなくフィルタリングです。
sum(Santa$Believe)
summary(santa $ Believe)
を実行すると、 TRUE
および FALSE
DPLYRはこれを本当に簡単にします。
x<-santa%>%
count(Believe)
グループごとにカウントする場合。たとえば、男性と女性がどれだけ信じているか、 group_by
:
x<-santa%>%
group_by(Gender)%>%
count(Believe)
data.table
を使用した 1行ソリューションは
library(data.table)
setDT(x)[,.N,by=Believe]
Believe N
1: FALSE 1
2: TRUE 3
sqldf
を使用すると、次のようになります。
library(sqldf)
sqldf("SELECT Believe, Count(1) as N FROM Santa
GROUP BY Believe")