2016-05-06 7 views
0

Ich habe ein Problem mit dem Verständnis, wie man Werte anstelle ihres Indexes vom Datenrahmen druckt.R Datenrahmen Rückgabewert Formularspalte, nicht der Index

Hier ist mein R-Code:

symmetric_difference <- function(x, ...) { 
    single_vect <- c(x, ...) 

    df <- as.data.frame(table(single_vect)) 

    lengthOfDf <- length(df$Freq) 

    result <- c() 

    for (i in 1:lengthOfDf) { 
    if(df$Freq[i] %% 2 == 1){ 
     result <- c(result, df$single_vect[i]) 
    } 
    } 
    return(result) 
} 

Was ich versuche alle Vorkommen eines bestimmten Wertes zählen zu tun, und dann, wenn die Zahl ungerade Anfügen der Wert Vektor zu führen. Was aber tatsächlich gespeichert wird, ist der Index aus dem Datenrahmen dieses Wertes.

Wenn ich meine ganze Variable drucke, oder names(df) verwende, sind die einzigen Spaltennamen, die ich sehe, "single_vect" und "Freq".

Ich versuchte Debugging mit print(), aber wenn innerhalb der if Klausel ich den Wert df$single_vect[i] drucken, bekomme ich einen tatsächlichen Wert, nicht den Index.

Was mache ich falsch?

Testbeispiel:

a <- c(1, 2, 3, 4) 
b <- c(2, 4, 6, 8) 
c <- c(3, 6, 9, 12) 
symmetric_difference(a, b, c) 

sollte zurückkehren 1, 8, 9, 12, sondern kehrt 1, 6, 7, 8

Auch ich diesen Code kennen könnte in eine Linie geschrumpft, aber ich versuche wirklich zu verstehen, was hier vor sich geht.

+0

Dies ist eine Bemerkung am Rande, aber 'Ergebnis <- c()' sollte 'Ergebnis <- numeric (lengthOfDf)' und 'Ergebnis <- c (Ergebnis df $ single_vect [i]) 'sollte' result [i] <- df $ single_vect [i] 'sein. Die Methode, die Sie verwenden, vergrößert den Vektor, der in Bezug auf Speichernutzung und Geschwindigkeit ineffizient ist. – lmo

+0

@ZheyuanLi Ich weise nur darauf hin, dass es keine anderen Spaltennamen zu verwenden gibt. Wenn ich also 'df $ single_vect [i]' tippe, erwarte ich einen Wert, keinen Index. – Asunez

+0

@ZheyuanLi Ja, anhängen. – Asunez

Antwort

1

Das Problem ist die single_vect Spalte Ihrer Tabelle wird zu einem factor gezwungen. Eine Möglichkeit, dies zu beheben:

symmetric_difference <- function(x, ...) { 
    single_vect <- c(x, ...) 

    df <- as.data.frame(table(single_vect)) 
    df$single_vect <- as.numeric(levels(df$single_vect)) 

    lengthOfDf <- length(df$Freq) 

    result <- c() 

    for (i in 1:lengthOfDf) { 
    if(df$Freq[i] %% 2 == 1){ 
     result <- c(result, df$single_vect[i]) 
    } 
    } 
    return(result) 
} 
+0

Das habe ich vermutet, aber ich hatte keine Ahnung, wie ich das beheben könnte. Vielen Dank! – Asunez

1

Ihr single_vect ist Vektor. ändere es vack zu numerisch. Verwendung

df$single_vect<-as.numeric(as.character(df$single_vect))