2016-05-09 19 views
0

Ich möchte alle Elemente in einer Zeichenfolge nach einer angegebenen Position ersetzen, die zwischen Zeichenfolgen variiert. Idealerweise würde die Lösung regex in der Basis R verwenden.Ersetzen Sie alle Elemente in Zeichenfolge nach einer angegebenen Position

Hier ist ein ausgearbeitetes Beispiel und das gewünschte Ergebnis:

my.last.position <- c(5, 7, 3, NA, 10) 

my.data <- read.table(text=' 
         my.string 
         .1.222.2.2 
         ..1..1..2. 
         1.1.2.2... 
         .222.232.. 
         ..1..1...1 
', header=TRUE, stringsAsFactors = FALSE) 
my.data 

desired.result <- read.table(text=' 
         my.string 
         .1.22..... 
         ..1..1.... 
         1.1....... 
         .222.232.. 
         ..1..1...1 
', header=TRUE, stringsAsFactors = FALSE) 
desired.result 

Der Vektor my.last.position die letzte Position angibt, in jedem Strang zu halten. Die data.framedesired.result enthält das gewünschte Ergebnis.

Vielen Dank für jeden Hinweis. Entschuldigung, wenn dies ein Duplikat ist.

+0

Im Gegensatz zu Ihrer anderen Frage, die eine einheitliche 1 zu 1 Beziehung ist, die eine gültige globale globale ersetzen ist, ist dies nicht das Gleiche. Dies erfordert das Zählen und Regex kann nicht zählen. Es ist möglicherweise in einer rekursiven Ersetzung machbar, aber es kann nicht global sein. Zum Beispiel, wo die Regex für jede Zeile konstruiert ist, finde '^ (. {N}. *?) 2' ersetze' $ 1' und benutze es in einer Weile (gsub()). Schleife. – sln

Antwort

2

Hoffentlich kann jemand mit einer eleganteren Lösung als diese kommen, aber hier geht:

mapply(
    function(s,i) paste(collapse='',if (is.na(i)) s else c(s[seq_len(i)],rep('.',length(s)-i))), 
    strsplit(my.data$my.string,''), 
    my.last.position 
); 
## [1] ".1.22....." "..1..1...." "1.1......." ".222.232.." "..1..1...1" 
+1

Das ist wirklich nett. –

+0

Wenn ich alle Elemente vor einer bestimmten Position ersetzen möchte, kann ich das tun, indem ich die Funktionszeile ändere: 'function (s, i) einfügen (collapse = '', if (is.na (i)) s else c (rep ('.', i-1), s [i: Länge (n)])), ' –

1

Hier ist eine andere Methode. Nicht sicher, dass es eleganter ist:

# as in the example output, any NAs are treated as do not mess with this 
# vector element 
my.last.position.NoNA <- ifelse(is.na(my.last.position), 
           nchar(my.data$my.string), my.last.position) 

# perform the replacement 
paste0(substr(my.data$my.string, 1, my.last.position.NoNA), 
    sapply(1:nrow(my.data), function(i) paste0(rep(".", 
       length=(nchar(my.data$my.string[i])-my.last.position[i])), 
       collapse=""))) 
Verwandte Themen