2017-02-21 3 views
-3

Ich versuche, eine Eigenart mit der subset() Funktion in R und die Verwendung der $-Operator zu verstehen. Ich werde den CO2-Datensatz in R als Beispiel:

I

sub <- subset(CO2, CO2$Type=="Quebec") 

ohne Fehler ausführen kann auf dem gleichen Datensatz zu gelangen, als wäre ich

sub <- subset(CO2, Type=="Quebec") 

jedoch laufen, Ich habe festgestellt, dass dies nicht immer der Fall ist.

Manchmal einschließlich der $ innerhalb subset() Funktion wird den folgenden Fehler

$ operator is invalid for atomic vectors

produzieren, was den ‚$ Operator ist ungültig für das Atom Vektoren‘ auslöst Fehler? Warum ist es in einigen Fällen zulässig ($) (wie im obigen CO2-Beispiel), aber nicht in anderen? (Ich bin besonders frustriert, wenn ich in meinem eigenen Daten durch read.csv() bringen und manchmal bekomme ich die Fehlermeldung, wenn sie mit $ der Teilmenge versucht, und ich manchmal nicht ohne erkennbares Muster)

Dank!

Pro Kommentaren, ich versuche, reproduzierbare Beispiele zu veröffentlichen. Hier

ist die Situation, die den Fehler auslöst:

Moose<-structure(list(Moose = 1:25, Tagging_Loc = structure(c(1L, 1L, 
2L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 
2L, 1L, 1L, 2L, 1L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
    Gender = structure(c(2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 
    2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 
    2L), .Label = c("F", "M"), class = "factor"), Age = c(20L, 
    23L, 14L, 15L, 10L, 9L, 5L, 10L, 19L, 22L, 21L, 21L, 7L, 
    16L, 19L, 9L, 23L, 5L, 9L, 10L, 16L, 8L, 13L, 14L, 6L), Weight = c(1366L, 
    1006L, 888L, 1359L, 899L, 635L, 400L, 1000L, 1012L, 1480L, 
    1001L, 1100L, 482L, 1414L, 971L, 725L, 1400L, 416L, 790L, 
    970L, 921L, 560L, 1103L, 904L, 669L), Distance = c(250.5, 
    410.239, 457.6402591, 245.8523, 430.9975, 308.8673107, 212.5212497, 
    414.2093545, 439.6581, 215.6491489, 464.2384, 425.4256828, 
    233.5635555, 207.98, 453.7098751, 390.0506365, 235.5212497, 
    207.368, 427.5084899, 443.0452824, 459.8999274, 274.6856592, 
    350.5661674, 456.9600032, 330.146)), .Names = c("Moose", 
"Tagging_Loc", "Gender", "Age", "Weight", "Distance"), class = "data.frame", row.names = c(NA, 
-25L)) 

sub_Moose<-subset(Moose, Moose$Tagging_Loc=="A") 

sub_Moose<-subset(Moose, Tagging_Loc=="A")' 

Aber wenn ich nur den Namen des Datensatzes ändern, beide Versionen von subset() Lauf in Ordnung - kein Fehler:

mOose<-structure(list(Moose = 1:25, Tagging_Loc = structure(c(1L, 1L, 
2L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 
2L, 1L, 1L, 2L, 1L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
    Gender = structure(c(2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 
    2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 
    2L), .Label = c("F", "M"), class = "factor"), Age = c(20L, 
    23L, 14L, 15L, 10L, 9L, 5L, 10L, 19L, 22L, 21L, 21L, 7L, 
    16L, 19L, 9L, 23L, 5L, 9L, 10L, 16L, 8L, 13L, 14L, 6L), Weight = c(1366L, 
    1006L, 888L, 1359L, 899L, 635L, 400L, 1000L, 1012L, 1480L, 
    1001L, 1100L, 482L, 1414L, 971L, 725L, 1400L, 416L, 790L, 
    970L, 921L, 560L, 1103L, 904L, 669L), Distance = c(250.5, 
    410.239, 457.6402591, 245.8523, 430.9975, 308.8673107, 212.5212497, 
    414.2093545, 439.6581, 215.6491489, 464.2384, 425.4256828, 
    233.5635555, 207.98, 453.7098751, 390.0506365, 235.5212497, 
    207.368, 427.5084899, 443.0452824, 459.8999274, 274.6856592, 
    350.5661674, 456.9600032, 330.146)), .Names = c("Moose", 
"Tagging_Loc", "Gender", "Age", "Weight", "Distance"), class = "data.frame", row.names = c(NA, 
-25L)) 

sub_Moose<-subset(mOose, mOose$Tagging_Loc=="A") 

sub_Moose<-subset(mOose, Tagging_Loc=="A") 
+1

Könnten Sie bitte ein reproduzierbares Beispiel geben? – kaksat

+3

Der Hauptgrund, warum Sie 'subset()' verwenden, ist, dass Sie '$' nicht verwenden müssen. Sie sollten ** nicht ** verwenden, wenn die Variable von Interesse aus dem data.frame des ersten Parameters kommt. Sie erhalten wahrscheinlich einen Fehler, wenn eine Spalte denselben Namen wie data.frame hat. Aber es könnte auch aus anderen Gründen passieren. Sie sollten wirklich ein [reproduzierbares Beispiel] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) zur Verfügung stellen, wenn Sie um Hilfe bitten – MrFlick

+2

Auch mach's gut mit der Verwendung von Subsets. Wie es unten in der Hilfedatei heißt, "? Subset", "Dies ist eine Komfortfunktion, die interaktiv verwendet werden soll. Für die Programmierung ist es besser, die Standard-Subsetting-Funktionen wie [und insbesondere die nicht-standardmäßige Auswertung von Argument-Subset kann unvorhergesehene Konsequenzen haben. " – lmo

Antwort

1

Don‘ t verwenden $ mit Teilmenge! Entweder verwenden

sub <- subset(CO2, Type=="Quebec") 

oder verwenden

sub <- CO2[CO2$Type=="Quebec", ] 

Die subset() Funktion funktioniert, indem alle Symbole in der Umgebung des data.frame evaulating. In Ihrem Moose Beispiel hat Ihr data.frame Moose einen Spaltennamen Moose. Also, wenn Sie

sub_Moose <- subset(Moose, Moose$Tagging_Loc=="A") 

der Ausdruck Moose$Tagging_Loc=="A" ausgeführt wird in der Umgebung des data.frame bewertet. In diesem data.frame gibt es eine Spalte namens Moose, die den Spaltenvektor auswertet, bevor sie den gleichnamigen data.frame findet. Beachten Sie, dass with() dem subset() sehr ähnlich ist, da es den Ausdruck im Kontext einer Umgebung oder eines Datenrahmens interpretiert. Beobachten

class(Moose) 
# [1] "data.frame" 
with(Moose, class(Moose)) 
# [1] "integer" 
class(Moose$Moose) 
# [1] "integer" 

So Moose$Tagging_Loc=="A" wird nur funktionieren, wenn Moose ein data.frame ist, aber wenn man subset() verwenden, Moose eine ganze Zahl Vektor, weil es zuerst die Spalte zu finden.

+0

Danke, @MrFlick. Ich habe viel von dieser Diskussion gelernt –

Verwandte Themen