2016-08-09 16 views
0

Entschuldigung für die Frage nach einer grundlegenden Frage. Ich habe in den folgenden Links für die Antwort versucht, Blick, aber ohne GlückSchleife zu verketten Zeichenfolge

How to concatenate strings in a loop?

How to concatenate strings in a loop?

C concatenate string with int in loop

So, hier ist ein reproduzierbares Beispiel. Ich habe eine Liste Haus d.h

house <- c("Dining Room", "Drawing Room", "Number of Bathrooms", "5", "Number of Bedroom", "5", "Number of Kitchens", "1")

wo jedes Element im Haus Liste genannt ist Charakter. Jetzt möchte ich eine andere Liste erstellen, in der das Element der Liste die Länge eines Zeichens hat (eine Zahl darstellt), dann sollte es mit dem vorherigen Zeichenfolgenelement verkettet werden. Das ist die Ausgabe, die ich erwarte.

"Dining Room", "Drawing Room", "Number of Bathrooms 5", "Number of Bedroom 5", "Number of Kitchens 1"

Ich habe versucht, eine Schleife läuft, aber der Ausgang ist nicht ähnlich zu dem, was ich erwarte.

for(i in house){ if(!is.na(nchar(house[i])) == 1) { cat(i,i-1) } else{ print(i) } }

+0

Ich muss sagen, das ist eine sehr seltsame für Ihre Daten in erster Linie sein. Ich würde mich sehr bemühen, solche Daten zu vermeiden, wenn überhaupt möglich: Da es einen Prozess geben muss, der diese Daten erzeugt, schlage ich vor, diesen Prozess zu ändern, um die Daten in einem anderen, logisch konsistenten Format zu erzeugen. –

+3

Eine Zahl könnte zum Beispiel '22' sein (2 Zeichen Länge), nein? Wie auch immer, du könntest das vollständig vektorisieren, indem du 'indx <- was (nchar (house) == 1); Haus [Indx - 1] <- Paste (Haus [Indx - 1], Haus [Indx]); house [-indx] ', zum Beispiel –

Antwort

1

Es gibt mehrere Möglichkeiten, dies zu tun. Unten ist eins. Wenn etwas unklar ist, lass es mich wissen.

house <- c("Dining Room", "Drawing Room", "Number of Bathrooms", "5", 
      "Number of Bedroom", "5", "Number of Kitchens", "1") 

# helper function that determines if x is a numeric character 
isNumChar = function(x) !is.na(suppressWarnings(as.integer(x))) 
isNumChar('3') # yes! 
isNumChar('Hello World') # no 

foo = function(x) { 
    # copy input 
    out = x 
    # get indices that are numeric characters 
    idx = which(isNumChar(x)) 
    # paste those values to the value before them 
    changed = paste(x[idx - 1], x[idx]) 
    # input changes over original values 
    out[idx - 1] = changed 
    # remove numbers 
    out = out[-idx] 
    # return output 
    return(out) 
} 

foo(house) 
[1] "Dining Room"   "Drawing Room"   "Number of Bathrooms 5" 
[4] "Number of Bedroom 5" "Number of Kitchens 1" 
+1

Sie brauchen keine Schleife. Sie könnten einfach 'idx <- was (isNumChar (Haus))' tun und diese Lösung sieht nur allzu vertraut –

Verwandte Themen