これは簡単に思えますが、どこにも簡単な答えは見つかりませんでした。
次のデータがあり、使用する場合table()
:
df <- data.frame(x=c("a","b","a"),y=c("b","a","c"))
table(df)
y
x a b c
a 0 1 1
b 1 0 0
取得する最も簡単な方法は何ですか:
y
x a b c
a 0 1 1
b 1 0 0
C 0 0 0
c
後で手動で行を追加することなく。
これは簡単に思えますが、どこにも簡単な答えは見つかりませんでした。
次のデータがあり、使用する場合table()
:
df <- data.frame(x=c("a","b","a"),y=c("b","a","c"))
table(df)
y
x a b c
a 0 1 1
b 1 0 0
取得する最も簡単な方法は何ですか:
y
x a b c
a 0 1 1
b 1 0 0
C 0 0 0
c
後で手動で行を追加することなく。
これが1つの方法です。x
基本的に、y
両方が同じレベルであることを確認する必要があります。私はunion()
、それぞれのlevels()
、次にtransform()
オリジナルのx
を計算し、y
両方にこの共通のレベルのセットを持たせることによってそれを行います:
> df <- data.frame(x=c("a","b","a"),y=c("b","a","c"))
> lev <- with(df, sort(union(levels(x), levels(y))))
> lev
[1] "a" "b" "c"
> df <- transform(df, x = factor(x, levels = lev), y = factor(y, levels = lev))
> table(df)
y
x a b c
a 0 1 1
b 1 0 0
c 0 0 0
あなたの例には簡単な解決策があります-のレベルが完全であるためx
、と同じレベルを与えるだけです。レベルの完全なセットがない、またはないより一般的な状況では、私が示すコードはその完全なセットを取得するため、両方の状況で機能します。y
y
x
y
それを行う簡単な方法は次のとおりです。
levels(df$x) <- levels(df$y) <- union(levels(df$x), levels(df$y))
一般的にまたは
levels(df$x) <- levels(df$y)
あなたの特定の状況のために。
次に、table(df) を呼び出します。基本的に、テーブルで可能な「レベル」を指定する必要があります。