2015-12-17 26 views
9

Ich versuche, eine Zeichenfolge in numerisch zu konvertieren, und habe unerwartetes Verhalten mit str_replace festgestellt. Hier ist ein Mindestarbeitsbeispiel:Unerwartetes Verhalten mit str_replace "NA"

library(stringr) 
x <- c("0", "NULL", "0") 

# This works, i.e. 0 NA 0 
as.numeric(str_replace(x, "NULL", "")) 

# This doesn't, i.e. NA NA NA 
as.numeric(str_replace(x, "NULL", NA)) 

Meine Ansicht nach sollte das zweite Beispiel arbeiten, wie es nur den zweiten Eintrag in dem Vektor mit NA ersetzen sollte (was ein gültiger Wert in einem Zeichenvektor). Aber es nicht: das innere str_replace konvertiert alle drei Einträge zu NA.

Was geht hier vor? Ich habe die Dokumentation für str_replace und stri_replace_all durchgesehen, sehe aber keine offensichtliche Erklärung.

EDIT: Um zu klären, ist dies mit stringr_1.0.0 und stringi_1.0-1 auf R 3.1.3, Windows 7.

+1

Sicherlich ein unerwartetes Verhalten im Quellcode, die korrigiert werden muss, Sie NA eine Zeichenfolge zur Verfügung stellen müssen es, um die Arbeit: 'as.numeric (str_replace (x, "NULL", "NA")) –

+0

Mögliche Abhilfe? 'x <- c (" 0 "," NULL "," 0 "); y <- x; y [y == "NULL"] <- NA; as.numeric (y) ' – bubble

+1

Ich muss etwas vermissen, das zweite Beispiel funktioniert für mich' as.numeric (str_replace (x, "NULL", NA)) [1] 0 NA 0' –

Antwort

3

Blick auf den Quellcode str_replace.

function (string, pattern, replacement) 
{ 
    replacement <- fix_replacement(replacement) 
    switch(type(pattern), empty = , bound = stop("Not implemented", 
     call. = FALSE), fixed = stri_replace_first_fixed(string, 
     pattern, replacement, opts_fixed = attr(pattern, "options")), 
     coll = stri_replace_first_coll(string, pattern, replacement, 
      opts_collator = attr(pattern, "options")), regex = stri_replace_first_regex(string, 
      pattern, replacement, opts_regex = attr(pattern, 
       "options")),) 
} 
<environment: namespace:stringr> 

Dies führt zu fix_replacement zu finden, die bei Github ist, und ich habe es unten zu setzen. Wenn Sie es in Ihrer Hauptumgebung ausführen, finden Sie, dass fix_replacement(NA)NA zurückgibt. Sie können sehen, dass es auf stri_replace_all_regex beruht, die aus dem Paket stammt.

fix_replacement <- function(x) { 
    stri_replace_all_regex(
     stri_replace_all_fixed(x, "$", "\\$"), 
     "(?<!\\\\)\\\\(\\d)", 
     "\\$$1") 
} 

Das Interessante daran ist, dass stri_replace_first_fixed und stri_replace_first_regex beide c(NA,NA,NA) zurück, wenn mit Parametern ausführen (Ihre string, pattern und replacement). Das Problem ist, dass stri_replace_first_fixed und stri_replace_first_regex C++ - Code sind, so dass es ein wenig schwieriger wird herauszufinden, was passiert.

stri_replace_first_fixed kann here gefunden werden.

stri_replace_first_regex kann here gefunden werden.

Soweit ich mit begrenzter Zeit und meinem relativ rostigen C++ - Wissen erkennen kann, überprüft die Funktion stri__replace_allfirstlast_fixed das replacement Argument mit stri_prepare_arg_string. Nach der documentation dafür, wird es einen Fehler werfen, wenn es eine NA trifft. Ich habe keine Zeit, um es vollständig zu verfolgen, aber ich würde vermuten, dass dieser Fehler die ungerade Rückkehr aller NAs verursacht.

3

Das war ein Fehler in dem stringi Paket aber jetzt ist es fixed (Rückruf dass stringr auf stringi basiert - die ehemaligen auch betroffen sein soll).

Mit der jüngsten Entwicklung Version erhalten wir:

stri_replace_all_fixed(c("1", "NULL"), "NULL", NA) 
## [1] "1" NA 
+0

Ich bekomme immer noch das Problem mit Stringr 1_2_0, die Stringi_1 aufruft .1.5? Obwohl das Problem auf GitHub geschlossen wurde, https://github.com/tidyverse/stringr/issues/110 Irgendeine Idee, was hapen ist? Vielen Dank! – Matifou

Verwandte Themen