おそらくこれが役立ちます:
df <- data.frame(group=c("a","b","c","a","b","c","a","b","c"),
var1=1:9, var2=c(1,2,3,NA,5,6,7,8,9))
with(df, length(cbind(var1, var2)))
> with(df, length(cbind(var1, var2)))
[1] 18
length()
cbind(var1, var2)
次元を持つ単なるベクトルである行列として扱うため、結果の行列prod(nrow(mat), ncol(mat))
がどこにあるかとして報告される長さを取得します。mat
nrow()
の代わりに を使用するのが理想的ですlength()
が、より広く適用できるのは、NROW()
関数を評価する目的でベクトルを 1 列の行列として扱う関数です。nrow()
ベクトル入力では機能しません
> nrow(1:10)
NULL
たとえば、これらを試してください:
aggregate(cbind(var1,var2) ~ group, df, NROW)
aggregate(var1 ~ group, df, NROW)
> aggregate(cbind(var1,var2) ~ group, df, NROW)
group var1 var2
1 a 2 2
2 b 3 3
3 c 3 3
> aggregate(var1 ~ group, df, NROW)
group var1
1 a 3
2 b 3
3 c 3
あなたが持っているようNA
に、おそらく不完全なケースを削除したくないでしょう。これはデフォルトで発生します。これは上に表示されているため、グループの行数が 2 である理由です。そのために、呼び出しa
に追加します。na.action = na.pass
aggregate(cbind(var1,var2) ~ group, df, NROW, na.action = na.pass)
> aggregate(cbind(var1,var2) ~ group, df, NROW, na.action = na.pass)
group var1 var2
1 a 3 3
2 b 3 3
3 c 3 3
問題は、 に渡すデータ フレームを構築する際aggregate.data.frame
に、通常のモデル フレーム生成プロセスが行われaggregate.formula
、na.action
引数na.omit
がデフォルトで に設定されることです。これは、数式インターフェイスを使用するモデリング関数の標準的な動作です。
NA
変数ごとの非値の数を数えたい場合は、おそらく次のように を使用してis.na()
、まったく異なるアプローチが必要です。
foo <- function(x) sum(!is.na(x))
aggregate(cbind(var1,var2) ~ group, df, foo, na.action = na.pass)
> aggregate(cbind(var1,var2) ~ group, df, foo, na.action = na.pass)
group var1 var2
1 a 3 2
2 b 3 3
3 c 3 3
これは、 first -> viaNA
の強制によって非値の数をカウントすることによって機能し、結果の s は に変換され、sは に変換され、それが追加されます。TRUE
FALSE
!
TRUE
1
FALSE
0
sum()