2016-08-29 2 views
2

die Folowing data.frame Bedenken Sie:stringr :: str_sub Ausgang ist unerwartet

df <- structure(list(sufix = c("atizado", "atoria", "atório", "auta", 
         "áutico", "ável"), min_stem_len = c(4, 5, 3, 5, 4, 2), replacement = c("", 
                           "", "", "", "", ""), exceptions = list(character(0), character(0), 
                                     character(0), character(0), character(0), c("afável", "razoável", 
                                                "potável", "vulnerável"))), .Names = c("sufix", "min_stem_len", 
                                                          "replacement", "exceptions"), row.names = 21:26, class = c("tbl_df", 
                                                                        "tbl", "data.frame")) 

Ich habe eine Liste von Strings in variablen sufix dieser data.frame. Jetzt habe ich ein Wort word <- "amável" und ich möchte den Suffix dieses Wortes mit der gleichen Länge wie jedes Wort der df$sufix erhalten.

Ich verwende den Folowing Code:

library(stringr) 
word <- "amável" 
str_sub(word, start = -stringr::str_length(df$sufix)) 

Aber das gibt dieses:

> str_sub(word, start = -stringr::str_length(df$sufix)) 
[1] "amável" "mável" "mável" "vel" "mável" "vel" 
> df$sufix 
[1] "atizado" "atoria" "atório" "auta" "áutico" "ável" 

Ich hatte erwartet, dass das letzte Element des resultierenden Vektors "Avel" zu sein, da:

> str_length("ável") 
[1] 4 
> str_sub(word, start = -4) 
[1] "ável" 

hier ein mor e einfaches reproduzierbares Beispiel:

set.seed(100) 
a <- sample(1:10, 10000, replace = T) 
res <- rep("ábc", 10000) %>% str_sub(start = -a) 
sum(ifelse(a > 3, 3, a) != str_length(res)) 
[1] 2504 
+1

eine Frage aufgeworfen Seite Stringi GitHub: https://github.com/gagolews/ stringi/issues/227 – PavoDive

Antwort

1

Dies hat in dem Entwicklungszweig von stringi fest, siehe https://github.com/gagolews/stringi/issues/227 (wie str_sub von stringr beruht auf stri_sub in stringi). Sobald ein Update auf CRAN, das richtige Verhalten vorliegt, wird von jedermann aus der „Öffentlichkeit“ replizierbar sein, als ist:

str_sub(word, start = -stringr::str_length(df$sufix)) 
## [1] "amável" "amável" "amável" "ável" "amável" "ável" 
1

Wenn Sie bemerken, sind alle Ergebnisse falsch (außer durch die erste).

Sie sollten

[1] "amável" "amável" "amável" "ável" "amável" "ável" 

waren dies durch

library(stringi) 
stri_sub(rep(word, 6), from = -stri_length(df$suffix)) 

leicht gelöst werden könnte ich wette, dass Sie Ihre stringr Code wiederverwenden könnte genau das gleiche.

### EDIT ###

ich jetzt ADD verstehen, was Sie meinen. Auf jeden Fall gibt es ein merkwürdiges Verhalten, höchstwahrscheinlich auf die Sonderzeichen á. Siehe nachstehendes Beispiel:

df <- data.frame(suffix = c("Lorem","ipsum","dolor","sit","amet","consectetur","adipiscing", "elit","Donec","arcu")) 
df$len <- stri_length(df$suffix) 

Schauen Sie sich das seltsame Verhalten im 7.en Elemente des Ergebnisses:

stri_sub("amavel", from = -df$len) 
## [1] "mavel" "mavel" "mavel" "vel" "avel" "amavel" "amavel" "avel" 
## [9] "mavel" "avel" 

# Compared to 
stri_sub("amável", from = -df$len) 
## [1] "mável" "mável" "mável" "vel" "ável" "amável" "mável" "ável" 
## [9] "mável" "ável" 

Seltsam genug, wird das Ergebnis im letzten Fall korrigiert, wenn rep verwendet wird:

stri_sub(rep("amável", 10), from = -df$len) 
## [1] "mável" "mável" "mável" "vel" "ável" "amável" "amável" "ável" 
## [9] "mável" "ável" 

# note how the 7th element is now correct. 

Also auch wenn es ein bisschen hacky ist, die Lösung oben sollte vorgesehen arbeiten.

Ich habe versucht, den Code von stri_sub, wo es sich auf C_stri_sub bezieht, aber das war eine Sackgasse für mich. Vielleicht kann jemand mehr kenntnisreich von C und/oder String-Manipulation kommen und helfen?

### ZWEITER EDIT ###

Es scheint mir das Problem mit der Wiederholung des Strings ist innerhalb des Aufrufs stri_sub.Schauen Sie sich diesen alternativen Code der, die Sie in Ihrem bearbeiten setzen:

set.seed(100) 
a <- sample(1:10, 10000, replace = TRUE) 
res <- stri_sub(rep("ábc", 10000), from = -a) 
sum(ifelse(a > 3, 3, a) != stri_length(res)) 
## [1] 0 
+0

Ich denke nicht, dass dies das Problem löst. Ich füge ein einfacheres reproduzierbares Beispiel hinzu. –

+0

Was ist Ihre erwartete Ausgabe? Mein Code erzeugt das Ergebnis, das ich über die Antwort eingefügt habe, was ich erwarte. – PavoDive

+0

Ich weiß es gelöst. Sehen Sie sich das einfache neue Beispiel an. Ihre Lösung funktioniert nicht für größere Vektoren. Es macht keinen Sinn, dass Ihre Lösung auch funktioniert, da in der Dokumentation stringr sagt, dass alle Argumente auf die Länge des längsten Arguments zurückgeführt werden. –

Verwandte Themen