2016-03-20 12 views
3

最近、因子の相互作用に基づいていくつかのデータをグラフ化しなければならなかったが、私はこれがRにあるべきであると感じるよりも困難であることが分かった。私は30の数のベクトルと1組の要素を持っているとしましょう。ファクタインタラクションを分離する方法

n <- runif(30, min=0, max=10) 
a <- gl(2, 1, 30) 
b <- gl(6, 2, 30) 

そして、それぞれの要素の組み合わせごとに平均が必要です。

y <- tapply(n, a:b, mean) 

は今、私はaの2つの値のそれぞれのパネルを持っているこれらの手段をプロットするために、格子xyplotを使用します。手段はyの値で、bの係数はxの値です。在庫xyplot

mydftapply上記から計算した列 yb、及び、 a有するデータフレームである
xyplot(y ~ b | a, data=mydf) 

ようなものであろう。しかし、私の問題は、相互作用する要素をどのように解消するかです。これは私がやったことです。今

factorSplit <- strsplit(names(y), ":") 
a1 <- sapply(factorSplit, function(x) {x[1]}) 
b1 <- sapply(factorSplit, function(x) {x[2]}) 
mydf <- data.frame(y, b1, a1) 

mydf

> mydf 
      y b1 a1 
1:1 3.856797 1 1 
1:2 3.487181 2 1 
1:3 8.411425 3 1 
1:4 3.757709 4 1 
1:5 4.982970 5 1 
1:6 6.480346 6 1 
2:1 2.778864 1 2 
2:2 4.390511 2 2 
2:3 7.119926 3 2 
2:4 4.707945 4 2 
2:5 5.546894 5 2 
2:6 8.984631 6 2 

を持って、私は

xyplot(y ~ b1 | a1, mydf, layout=c(1,2)) 

にプロットすることができます。しかし、私はsapplyが過剰ですnames(y)strsplitでこのビジネスを感じるし、その後で作成された因子相互作用を回復するためのより直接的な方法があるはずです。

+4

あなたは 'A'と 'B'の列を保持したいので、それは' tapply' 'よりも、ここでaggregate'使用することをお勧めします:' Y <を - 集約(N〜A + B、NULL、平均値) ' – MrFlick

+0

' aggregate'はかなりいいです。基本的なグループ化があまりにも混乱してしまうと、私はたいてい 'dplyr'に目を向けます。これはかなり簡単です。この場合、 'data_frame(n、a、b)%>%group_by(a、b)%>%summarize(y =平均(n))' – alistaire

+0

ソリューションで質問を更新するのではなく、下の答え(あなた自身の質問に答えるのはいいです)は、質問がもはや答えられないように見えるからです。 – MrFlick

答えて

0

集約機能は私の理解が欠けていたものです。コメントで指摘されているように、集約への1回のコールは、私が以前に迷っていたことすべてを行います。

> x <- aggregate(n ~ a+b, NULL, mean) 
> head(x) 
    a b  n 
1 1 1 2.967073 
2 2 1 3.001279 
3 1 2 3.867564 
4 2 2 1.076378 
5 1 3 2.805827 
6 2 3 6.275858 
> dim(x) 
[1] 12 3 
>