Beim Versuch zu verstehen, was "percent_rank" macht,
Ich habe einen Blick auf den Code geworfen und den Ausdruck length(!is.na(x))
gefunden. Ich kann mir keine Situation vorstellen, in der length(x) != length(!x)
also ich frage mich, ob das ein Tippfehler ist (vielleicht sollte es sum(!is.na(x))
sein?) oder wenn hier wirklich so eine Situation ist ??
Dies ist ein Fehler. Dieser Code wurde in diesem Commit eingeführt. Dies ist eine angegebene Antwort auf Ausgabe 774 . Hadley schreibt in Heft # 774:
Oh hoppla, ich würde sagen, das ist ein Fehler in meiner R-Implementierung. Der Nenner sollte die Anzahl der Nicht-NAs sein, nicht die Länge. (Hervorhebung hinzugefügt)
Wir brauchen keine Optionen, um das Verhalten zu kontrollieren, stellen Sie einfach sicher, dass NAs in der Eingabe sind sind NA in der Ausgabe
Aber wie Sie bemerken, hätte es sum(!is.na(x))
not length
sein müssen, um die beabsichtigte Korrektur zu implementieren.
Ich denke, es ist eine Frage der Präferenz. Sogar die Hilfe sagt:
x ein Vektor von Werten zum Rang. Fehlende Werte bleiben so wie sie sind. Wenn Sie sie als die kleinsten oder größten Werte behandeln wollen, Ersetzen Sie vor dem Ranking durch Inf oder -Inf.
Wenn Sie percent_rank
in einzelne Elemente zerlegen und auf einen Beispielvektor anwenden, erhalten Sie:
Mir geht es gut, wie die Funktion gerade funktioniert. Sie müssen nur sicherstellen, dass NA
in Inf/-Inf
geändert wird, wenn Sie immer einen Bereich von 0-1 erhalten möchten. Worüber ich mir nicht sicher bin, ob dies dem SQL2003-Standard entspricht.
Von ?is.na
Ich sehe zwei Möglichkeiten:
Erstens wird, wenn die Standardmethode is.na()
verwendet wird, dokumentiert, dass "ein logischer Vektor mit derselben Länge wie sein Argument x
zurückgegeben wird, der TRUE
für die Elemente enthält, die mit NA
markiert sind." oder, für numerische oder komplexe Vektoren, NaN
und FALSE
ansonsten. " (aus ?is.na
, Wertbereich).
Sie haben also recht, wenn Sie vermuten, dass es keinen Fall gibt, in dem length(is.na(x)) != length(!is.na(x))
ist.
Wenn eine nicht standardmäßige Methode angewendet wurde, konnte der Autor dieser Methode ein Objekt zurückgeben, das nicht mit der Dokumentation des generischen Objekts (und der Standardmethode) kompatibel ist. In diesem Fall sind alle Wetten deaktiviert.
Ich finde diese Option etwas schwierig, aber es ist möglich, wenn sie pervers ist.
Ich schlage vor, dass Sie das Problem auf Hadleys Github Repo melden.