0

因子変数と数値変数の両方で構成される大きなデータフレームがあります (数値変数には NA が含まれます)。因子変数の 1 つの異なるレベルについて、複数の数値変数の観測数を見つけたいと思います。各数値変数を個別に扱う代わりに、グループ化して length() を使用してカウントしたい数値変数を示すために、集計関数をドット表記または cbind で使用しようとしています。ただし、この集計を行うと、変数ごとに同じ数の観測値が得られますが、これは間違っていることがわかっています。複数の変数に対して機能しない集計と長さについて何かありますか?

問題を説明する簡単な例を次に示します... var1 はすべてのグループで n=3 を持つ必要があります。これは、それを単独で処理するときに行われますが、ドット表記または cbind を使用すると、var2 の n 値を想定するだけです。

    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))
    aggregate(var1 ~ group, df, length) 
    aggregate(var2 ~ group, df, length) 
    aggregate(. ~ group, df, length)
    aggregate(cbind(var1,var2) ~ group, df, length)
4

1 に答える 1

4

おそらくこれが役立ちます:

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.formulana.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()

于 2013-05-17T20:34:04.547 に答える