2017-12-05 5 views
1
type<-c("111","111","111","222","222","222","222","333","333","333","444","444","444") 

location<-c("aaa","bbb","ccc","aaa","bbb","ddd","eee","aaa","ccc","ddd","ccc","ddd","fff") 

datafr1 <- data.frame(type,location) 

gemeinsamen Wert proportional erhalten möchte ich das Ergebnis wie folgt aus. (Brauchen nicht ein Format so sein.)wie durch jede Zeile in r

  222  333 444 
111  0.66% 0.66% 0.33% 

und 222, 333, 444 auch. Finden Sie die gemeinsamen Werte und erhalten Sie dann Anteil der Schnittmenge.

Können Sie mir helfen? !!

+0

Sind diese Werte korrekt? 'prop.table (tcrosssprod (table (datafr1)), 1)' – akrun

+0

thx für Antwort !. aber zwischen 111 und 111 muss 1 sein. Und zwischen 111 und 222 muss 2/3 = 0,66% sein! –

+0

Bitte überprüfen Sie die unten angegebene Lösung. – akrun

Antwort

5

Wir können auf den table Ausgang von ‚datafr1‘ ein Kreuzprodukt tun, dann teilen jede Zeile von dem Maximalwert der Ausgabe für die rbindlist am Ende

m1 <- tcrossprod(table(datafr1)) 
m1/matrixStats::rowMaxs(m1) 
#  type 
#type  111  222  333  444 
# 111 1.0000000 0.6666667 0.6666667 0.3333333 
# 222 0.5000000 1.0000000 0.5000000 0.2500000 
# 333 0.6666667 0.6666667 1.0000000 0.6666667 
# 444 0.3333333 0.3333333 0.6666667 1.0000000 
+1

Oh mein Gott. Ich habe es in meinem Traum gekämpft, aber Sie haben es gelöst ... Wie machen Sie diese einfache Funktion in wenigen Minuten .... Sie sind genial ... Ich schätze wirklich !!! –

+1

Ich habe es gemacht und die Ergebnisse bekommen. Du bist echt Gott ..! –

+0

@ 승준승준 Danke für die Kommentare. Ich bin nur ein anderer Typ, der gerne programmiert. – akrun

1

I nur data.table verwendet werde. Sie können dies durch eine do.call auf rbind oder etwas ähnliches ersetzen, wenn Sie nicht data.table verwenden möchten.

typevals <- unique(datafr1$type) 

funky <- function(typeval) { 
    uniqueloc <- unique(datafr1[type == typeval,]$location) 
    props <- sapply(typevals, 
        function(x) { 
        length(intersect(uniqueloc, datafr1[type == x,]$location))/length(uniqueloc) 
        }) 
    props <- round(props, 2) 
    df <- data.frame(t(props)) 
    names(df) <- typevals 
    df <- cbind(data.frame(type = typeval), df) 
} 
rbindlist(lapply(typevals, funky)) 
# type 111 222 333 444 
# 1: 111 1.00 0.67 0.67 0.33 
# 2: 222 0.50 1.00 0.50 0.25 
# 3: 333 0.67 0.67 1.00 0.67 
# 4: 444 0.33 0.33 0.67 1.00 
+0

omg its awesome..wie ihr denkt, dass diese funktionieren .. Ich bin nur erstaunt und geschockt ... Ich schätze es wirklich. Ich habe über 12 Stunden gekämpft, aber ihr habt in einer Minute gelöst ... !! –

+0

nochmal thx für tour detail explantion! ich werde folgen –

Verwandte Themen