2016-11-29 3 views
1

私はRが新しくなったので、私を許してください。私はこの質問をどのようにするかわからない...この質問の目的は、どの2つまたは3つの要因が最も共有されているかを理解することです。 私はこのようなデータフレームを有する:データフレーム内の無作為に選択された2つの列の合計共有値を取得する方法

mydata<-read.table(header=TRUE, text=" 
        A B C D 
        peak_1 peak_1 0 0 
        peak_2 0 0 peak_2 
        0 0 peak_3 peak_3 
        peak_4 0 0 peak_4 
        peak_6 0 0 0 
        peak_7 0 peak_7 0 
        peak_8 peak_8 peak_8 peak_8") 

A、B、C及びDは、4つの要因です。うまくいけば、このテーブルはあなたのRにうまく表示できます。 2つの列の間に共有される値の数(0ではなく)を求めたいと思います。私は、その結果を以下のように表示されます期待している:

myresuts<-read.table(header=TRUE, text = " 
        factor_1 factor_2 number_of_shared 
        A B 2 
        A C 2 
        A D 3 
        B C 1 
        B D 1 
        C D 2") 

この小さなテーブルのために、私は手動で交差点を行うことができます。しかし、実際には、このような計算を行うために100列以上の非常に大きなテーブルがあります。私はこの問題を解決する関数を書く方法を知っています。 また、3つの列ごとに共有値の合計を計算したい場合(これは同じ方法で解決できますように)

ありがとうございます!

+0

まあは、最終的には私の質問にコードを配置する方法を見つけ出す... – Badgerliu

答えて

0

希望する結果は、比較でゼロの値を数えたくないことを示しています。私はゼロを最初にNAに変換することでこれをやっています(私は文字に変換して、重複しない値と比較することもできます)。

mydata <- lapply(mydata, 
       function(x) { 
        x[x==0] <- NA 
        as.character(x) 
}) 

cc <- combn(names(mydata),2, 
     FUN=function(x) { 
     data.frame(matrix(x,nrow=1), 
        val=sum(mydata[[x[1]]]==mydata[[x[2]]],na.rm=TRUE)) 
     }, 
     simplify=FALSE) 

do.call(rbind,cc) 

あなたが適切に機能して条件を変更する場合、これは3列のために働く必要があります...

+0

ありがとう!あなたの人の答えを読んで新しい学習者のために、私はいつも私の質問から期待されたものより多くを得ることができます! – Badgerliu

+0

感想が評価されている間、StackOverflowは[ありがとう]と言うコメントを使用して非推奨です(http://meta.stackoverflow.com/questions/258004/should-thank-you-comments-be-flagged?lq=1) ;この回答が有用であれば、十分な評判があればそれをアップヴォートすることができます。また、あなたの質問に満足して答えた場合は、それを受け入れるためにチェックマークをクリックすることをお勧めします。 –

1

組み合わせと置換を計算するのに便利な関数は、gtoolsライブラリにあります。

library(gtools) 
cbn <- data.frame(combinations(ncol(mydata),2,names(mydata))) 
cbn$num_shared = apply(cbn, 1, function(i) sum(mydata[,i[1]] == mydata[,i[2]])) 

cbn 
X1 X2 num_shared 
1 A B   2 
2 A C   3 
3 A D   4 
4 B C   4 
5 B D   3 
6 C D   4 

あなたは、ゼロを比較mydata[mydata == 0] <- NAを使用してNAに変換し、合計の内側na.rm = Tを配置したくない場合。

+0

ありがとう!このライブラリは非常に便利です。しかし、私は "0"を共有アイテムにしたくありません。それを排除するためにとにかくありますか? – Badgerliu

関連する問題