2016-09-02 4 views
1

Ich habe einen Datenrahmen wie folgt:numerische Spaltennamen in R

structure(list(`104` = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, "yes", NA, NA, NA, NA), `15` = c(NA, 
NA, NA, NA, ">= 4.0", ">= 4.0", NA, "~ 2", "~ 2", "~ 2", "~ 2", 
"~ 2", "~ 2", "< 2.2", "~2.75", NA, "~2.75", "~2.75", "~2.75", 
"~2.75")), .Names = c("104", "15"), row.names = 45:64, class = "data.frame") 

Ich weiß, dass es nicht am besten Praktiken ist numerische Spaltennamen haben, jedoch ist es unter diesen Umständen notwendig. Ich manipuliere meinen Datenrahmen durch das Abrufen von Spalten mit einem Backtick `

Leider fand ich etwas lustiges im oben genannten Datenrahmen.

> table(testtest$`10`) 

yes 
    1 
> 

Allerdings gibt es keine Spalte mit einem Namen von 10, so sieht es aus wie es

> table(testtest$`104`) 

yes 
1 
> 
Abrufen ist

ich nervös bin jetzt, und das Vertrauen nicht, dass dies wieder auftauchen kann, ohne mein Wissen für andere Spalten wie 41 und 4100.

Jede Erklärung wäre hilfreich! Danke

+2

mit der praktischen Funktion mit einem nicht-numerischen Zeichen „X“ anhängen Es ist besser, zu verwenden '[[' statt '$', da es teilweise Übereinstimmung – akrun

Antwort

4

Dies ist aufgrund der teilweise Übereinstimmung. Um dies zu vermeiden, verwenden Sie [[, um die Spalten zu extrahieren

testtest[["10"]] 
#NULL 

während die korrekte Spaltenname die Ausgabe

testtest[["104"]] 
#[1] NA NA NA NA NA NA NA NA NA NA NA 
#[12] NA NA NA NA "yes" NA NA NA NA 

Nach ?"$"

Beide gibt [[und wählen Sie $ ein einzelnes Element der Liste. Der Hauptunterschied ist, dass $ berechnete Indizes nicht erlaubt, wohingegen [[tut. x $ name ist entspricht x [["name", genau = FALSE]]. Auch das partielle Matching Verhalten von [[kann mit dem genauen Argument gesteuert werden.


Im Allgemeinen ist es besser, nicht einen numerischen Spaltennamen oder Namen zu haben, die mit Zahlen beginnen. Wir können make.names

names(testtest) <- make.names(names(testtest)) 
names(testtest) 
#[1] "X104" "X15"