29

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

> 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 行だけを示しました...)

ありがとう!

4

7 に答える 7

40

使用できます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 
于 2009-11-28T19:57:34.033 に答える
23

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

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

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

最初のステップでは、サブセット関数がこれを行うのに適した方法です (通常のインデックスまたはブラケット表記に代わるものです)。

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も仕事をします。この関数はデータ フレームの次元(行、列) を返すため、適切なインデックスを指定して行数にアクセスするだけで済みます。

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

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

そういうわけで、私にとって、これはクロス集計の問題ではなくフィルタリングの問題です。

于 2009-11-29T16:51:40.453 に答える
15
sum(Santa$Believe)
于 2009-11-28T20:04:11.383 に答える
0

sqldfここに適合する使用:

library(sqldf)
sqldf("SELECT Believe, Count(1) as N FROM Santa
       GROUP BY Believe")
于 2019-05-05T05:54:10.950 に答える