2016-03-29 4 views
1

集合体を使用する際に、与えられたデータセットに表示されない場合でも、どのような因子の相互作用が含まれているかを確認できます。私が欲しいものR - すべての因子レベルの相互作用を保証する集合関数のようなもの

dff <- data.frame(a=as.factor(c(rep(1,3), rep(2,4), rep(3,3))), 
        b=as.factor(c(rep("A", 4), rep("B",6))), 
        c=sample(100,10)) 

levels(dff$b) <- c(levels(dff$b), "C") 
levels(dff$a) <- c(levels(dff$a), 10) 

dff$b 
#[1] A A A A B B B B B B 
#Levels: A B C 
dff$a 
#[1] 1 1 1 2 2 2 2 3 3 3 
#Levels: 1 2 3 10 

aggregate(c~a+b, dff, sum) 
# a b c 
#1 1 A 233 
#2 2 A 78 
#3 2 B 212 
#4 3 B 73 

は、NAが細かすぎる

 a b c 
    1 1 A 233 
    2 1 B 0 
    3 1 C 0 
    4 2 A 78 
    5 2 B 212 
    6 2 C 0 
    7 3 A 0 
    8 3 B 73 
    9 3 C 0 
    10 10 A 0 
    11 10 B 0 
    12 10 C 0 

です。

私がdff $ cと他のデータセットの結果をやりとりする必要があるため、すべての因子レベルが考慮されていないと長さが異なる可能性があるためです。私はマージを避けようとしており、代わりにベクトル計算を使用しています。

ありがとうございます。

+1

'からcomplete'を使用しますか"?あなたはこの*特定の問題を解決しようとしているのですか? – A5C1D2H2I1M1N2O1R2T1

+1

この特定の問題については、as.data.frame(xtabs(c〜a + b、dff))のように 'as.data.frame(xtabs(...))' 。 – A5C1D2H2I1M1N2O1R2T1

+1

ランダムプロセスでサンプルを作成する場合は、再現性のために '?set.seed'を追加してください。 –

答えて

2

集計関数がちょうどsumになる場合は、を含むオブジェクトを作成するxtabsを使用することができます。このように、data.frameを使用することができます。data.frameは、それぞれ「メソッド」を呼び出し、「長い」data.frameを作成します。

data.frame(xtabs(c ~ b + a, dff)) 
# b a Freq 
# 1 A 1 121 
# 2 B 1 0 
# 3 C 1 0 
# 4 A 2 89 
# 5 B 2 203 
# 6 C 2 0 
# 7 A 3 0 
# 8 B 3 126 
# 9 C 3 0 
# 10 A 10 0 
# 11 B 10 0 
# 12 C 10 0 

これは、明示的に明示されていないクラス「テーブル」のであるが、1つとして扱うことができる何かのためにメソッドを呼び出しas.data.frame.tableを、使用するために、@のニコラの提案に似ています。

sum以外の異なる機能を使用できるという利点があります。

as.data.frame.table(tapply(dff$c, dff[c("a","b")], sum)) 

mergeがOKであれば、あなたはあなたのaggregateステップに進むことができます。この場合、我々はあなたの因子ベクトルのlevelsexpand.gridを使用します。

merge(expand.grid(lapply(dff[c(1, 2)], levels)), 
     aggregate(c~a+b, dff, sum, drop = FALSE), all = TRUE) 

同様のアプローチは、「data.table」で撮影することができます。

library(data.table) 
as.data.table(dff)[, sum(c), by = .(a, b)][do.call(CJ, lapply(dff[c(1, 2)], levels)), on = c("a", "b")] 

または「dplyr」+「tidyrを使用して基地Rでtidyr "または` expand.grid` + `merge`:「(本質的マージを隠し、最終的に不足している組み合わせを作成するleft_joinを使用する)

library(dplyr) 
library(tidyr) 

dff %>% 
    group_by(a, b) %>% 
    summarise(c = sum(c)) %>% 
    complete(a, b, fill = list(c = 0)) 
+0

上記のコメントと詳細な説明にお手数をおかけしていただきありがとうございます! – chungkim271

関連する問題