2017-12-29 8 views
0

Ich möchte mit Adist Bearbeitungsabstand zwischen den Werten von zwei Spalten in jeder Zeile berechnen.mit Adist auf zwei Spalten von Datenrahmen

Ich benutze es in mehr oder weniger so:

A <- c("mad","car") 
B <- c("mug","cat") 
my_df <- data.frame(A,B) 
my_df$dist <- adist(my_df$A, my_df$B, ignore.case = TRUE) 
my_df <- my_df[order(dist),] 

Die letzten beiden Zeilen sind die gleichen wie in meinem Fall, aber die tatsächliche Datenrahmen sieht ein bisschen anders - Spalten meiner ursprünglichen Datenrahmen sind Zeichentyp, nicht Faktor. Auch die Dist-Spalte scheint als 2-Spalten-Matrix zurückgegeben zu werden, ich habe keine Ahnung, warum es passiert.

Update: ich ein bisschen gelesen und fand, dass ich es über die Zeilen anwenden muß, so mein neuer Code folgt:

apply(my_df, 1, function(d) adist(d[1], d[2])) 

Es funktioniert gut, aber für meine ursprünglichen Daten-Set nennt es von Spaltennummern ist unpraktisch, wie kann ich auf Spaltennamen in dieser Funktion verweisen?

Antwort

1

können Sie dieses Problem lösen, indem mapply verwenden, dh

mapply(adist, df$A, df$B) 
#[1] 2 1 
+0

Funktioniert perfekt, danke! – PrzeM

1

Gemäß adist Funktionsdefinition die x und y Argumente sollten Zeichen Vektoren sein. In Ihrem Beispiel gibt die Funktion eine 2x2-Matrix zurück, weil sie auch die Kreuzwörter "mad" mit "cat" und "car" mit "mug" vergleicht.

Schauen Sie sich die Matrixdiagonale an.

+0

ich mit 'apply' hier nur gefunden zu verwenden, hat den Eröffnungsbeitrag aktualisiert. – PrzeM

2

Mit tidyverse Ansatz, können Sie den folgenden Code verwenden:

library(tidyverse) 
A <- c("mad","car") 
B <- c("mug","cat") 
my_df <- data.frame(A,B) 

my_df %>% 
    rowwise() %>% 
    mutate(Lev_dist=adist(x=A,y=B,ignore.case=TRUE)) 
+1

Ich habe 'Mapply' als eine einfachere Methode verwendet, aber immer noch danke für Ihren Beitrag. – PrzeM

Verwandte Themen