59 Stimmen

Warum erhalte ich die Warnung "Längere Objektlänge ist kein Vielfaches der kürzeren Objektlänge"?

Ich habe den Datenrahmen dih_y2. Diese beiden Zeilen geben mir eine Warnung:

> memb = dih_y2$MemberID[1:10]
> dih_col = which(dih_y2$MemberID == memb)  
Warning message:
In dih_y2$MemberID == memb :
longer object length is not a multiple of shorter object length

Warum?

96voto

Dason Punkte 58072

Sie geben kein reproduzierbares Beispiel an, aber Ihre Warnmeldung verrät Ihnen genau, wo das Problem liegt.

memb hat nur eine Länge von 10. Ich vermute, dass die Länge von dih_y2$MemberID nicht ein Vielfaches von 10 ist. Bei der Verwendung von == R spuckt eine Warnung aus, wenn es sich nicht um ein Vielfaches handelt, um Sie darauf hinzuweisen, dass es wahrscheinlich nicht das tut, was Sie von ihm erwarten. == führt eine elementweise Überprüfung auf Gleichheit durch. Ich vermute, Sie wollen herausfinden, welche der Elemente von dih_y2$MemberID sind auch im Vektor memb . Dazu müssen Sie die Funktion %in% Betreiber.

dih_col <- which(dih_y2$MemeberID %in% memb)

34voto

joran Punkte 163857

Wenn Sie einen booleschen Vergleich zwischen zwei Vektoren in R durchführen, wird erwartet, dass beide Vektoren gleich lang sind, so dass R jedes entsprechende Element nacheinander vergleichen kann.

R hat eine viel geliebte (oder gehasste) Funktion namens Recycling Wenn Sie versuchen, etwas zu tun, bei dem R normalerweise erwarten würde, dass die Objekte gleich lang sind, wird das kürzere Objekt automatisch verlängert oder recycelt, damit beide Objekte die gleiche Länge haben.

Wenn das längere Objekt ein Vielfaches des kürzeren ist, läuft dies darauf hinaus, dass das kürzere Objekt einfach mehrmals wiederholt wird. Oft machen sich R-Programmierer dies zunutze, um Dinge kompakter und mit weniger Tipparbeit zu erledigen.

Wenn es sich aber nicht um Vielfache handelt, wird R befürchten, dass Sie einen Fehler gemacht haben und den Vergleich vielleicht gar nicht durchführen wollten, daher die Warnung.

Erkunden Sie sich selbst mit dem folgenden Code:

> x <- 1:3
> y <- c(1,2,4)
> x == y
[1]  TRUE  TRUE FALSE
> y1 <- c(y,y)
> x == y1
[1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE
> y2 <- c(y,2)
> x == y2
[1]  TRUE  TRUE FALSE FALSE
Warning message:
In x == y2 :
  longer object length is not a multiple of shorter object length

16voto

landrower Punkte 457

Ich hatte ein ähnliches Problem und benutzte %in% == (Gleichheits-)Operator war die Lösung:

# %in%

Ich hoffe, es hilft.

1voto

EDennnis Punkte 171

Ich hatte ein ähnliches Problem, aber es hatte mit der Struktur und der Klasse des Objekts zu tun. Ich würde prüfen, wie dih_y2$MemberID formatiert ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X