2016-11-29 4 views
1

Ich bin ziemlich neu in R, also bitte verzeih mir. Ich weiß nicht einmal, wie ich diese Frage stellen soll ... Der Zweck dieser Frage ist herauszufinden, welche zwei oder drei Faktoren am meisten geteilt werden. Ich habe einen Datenrahmen wie folgt aus:Wie bekomme ich die Summe geteilt Werte aller zufällig ausgewählten zwei Spalten in einem Datenrahmen

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 und D sind vier Faktoren. Hoffentlich kann diese Tabelle gut in Ihrem R. angezeigt werden. Ich möchte die Anzahl der gemeinsamen Wert (aber nicht 0) zwischen jeweils zwei Spalten herausfinden. Ich erwarte Ergebnisse werden wie folgt angezeigt:

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") 

Für diese kleine Tabelle kann ich die Kreuzung manuell tun. Aber tatsächlich habe ich einen ziemlich großen Tisch mit mehr als 100 Spalten, um eine solche Berechnung durchzuführen. Ich frage mich, wie man eine Funktion schreibt, um dieses Problem zu lösen. Auch, wenn ich die Summe der gemeinsamen Werte in jeder drei Spalte herausfinden möchte (hoffentlich kann das auf die gleiche Weise gelöst werden).

Danke!

+0

Gosh, Figur schließlich heraus, wie Code in meiner Frage stellen ... – Badgerliu

Antwort

0

Ihre gewünschten Ergebnisse deuten darauf hin, dass Sie im Vergleich keine Nullwerte zählen möchten. Ich tue dies, indem ich zuerst Nullen in NA umwandle (ich konvertiere auch in Zeichen, so dass wir Spalten mit nicht überlappenden Werten vergleichen können).

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) 

Dies sollte für 3 Spalten arbeiten, wenn Sie die Bedingung in der Funktion entsprechend ändern ...

+0

Danke! Für einen neuen Lerner, der deine Antworten liest, kann ich immer mehr bekommen, als ich von meinen Fragen erwartet habe! – Badgerliu

+0

Während die Stimmung geschätzt wird, lehnt StackOverflow [mit Kommentaren, um "Danke" zu sagen] ab (http://meta.stackoverflow.com/questions/258004/should-thank-you-comments-be-flagged?lq=1). ; Wenn diese Antwort nützlich ist, können Sie sie aufwerten (wenn Sie eine ausreichende Reputation haben) und in jedem Fall, wenn sie Ihre Frage zufriedenstellend beantwortet, werden Sie ermutigt, das Häkchen zu setzen, um es zu akzeptieren. –

1

Eine nützliche Funktion zum Berechnen von Kombinationen und Permutationen finden Sie in der Bibliothek .

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 

Wenn Sie nicht wollen, Nullen zu vergleichen, wandeln sie in NAmydata[mydata == 0] <- NA mit und legen na.rm = T in der Summe.

+0

Dank! Diese Bibliothek ist sehr hilfreich. Aber ich möchte nicht, dass "0" ein geteilter Artikel ist. Gibt es trotzdem einen Ausschluss? – Badgerliu

Verwandte Themen