おそらくこれが役立ちます:
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は に変換され、それが追加されます。TRUEFALSE!TRUE1FALSE0sum()