2016-09-01 4 views
1

Ich versuche einen Vektor für einen Datenrahmen zu erstellen, der alle Punkte und Symbole der Klasse [: punct:] in R enthält. Gibt es eine Möglichkeit, den Inhalt auszudrucken der Klasse, anstatt zu versuchen, alle Charaktere aneinander zu reihen? Scheint so, als müssten Sie jedem Charakter entkommen und sie alle manuell in die Saite einfügen, was extrem mühsam erscheint.Zeichne alle Punkte und Symbole in einer Zeichenkette

Dies sind alle Symbole:

! " # $ % & ’ () * + , - ./: ; <=> ? @ [  ]^_ ` { | } ~. 
#code so far 
symbols <- c(' ! " # $ % & ’ () * + , - ./: ; <=> ? @ [  ]^_ ` { | } ~. ') 

Jede Hilfe wäre sehr geschätzt. Vielen Dank.

+0

Was ist Ihr Aufgabe: nur um alle Symbole aus der Klasse in einer Zeichenfolge zu sammeln oder alle zu löschen Symbole aus einer anderen Zeichenfolge? –

+0

Sammeln Sie alle Symbole aus einer Klasse in eine Zeichenfolge – petergensler

+0

versuchen Sie und finden Sie die entsprechenden Raw-Nummern ... dh 'rawToChar (as.raw (1: 200))' – user20650

Antwort

4

Sie aus roh Charakter umwandeln kann und dann grep für vordefinierte Klassen:

(rch <- as.raw(0:255)) 
# [1] 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 ... 

(ch <- rawToChar(rch, TRUE)) 
# [1] "" "\001" "\002" "\003" "\004" "\005" "\006" "\a" "\b" "\t" "\n" "\v" "\f" ... 


## change locale to avoid warnings 
Sys.setlocale('LC_ALL','C') 

dput(grep('[[:punct:]]', ch, value = TRUE)) 
# c("!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", 
# "-", ".", "/", ":", ";", "<", "=", ">", "?", "@", "[", "\\", 
# "]", "^", "_", "`", "{", "|", "}", "~") 

?regex beschreibt diese Klassen:

[:alnum:] alphanumerische Zeichen: [:alpha:] und [:digit:].

[:alpha:] Alphabetische Zeichen: [:lower:] und [:upper:].

[:blank:] Leere Zeichen: Leerzeichen und Tabulatorzeichen und möglicherweise andere vom Gebietsschema abhängige Zeichen, z. B. Leerzeichen.

[:cntrl:] Steuerzeichen. In ASCII haben diese Zeichen die oktalen Codes 000 bis 037 und 177 (DEL). In einem anderen Zeichensatz sind dies die entsprechenden Zeichen, sofern vorhanden.

[:digit:] Digits: 0 1 2 3 4 5 6 7 8 9.

[:graph:] Graphical Zeichen: [: alnum:] und [: punct:].

Kleinbuchstaben im aktuellen Gebietsschema.

[:print:] Druckbare Zeichen: [:alnum:], [:punct:] und Raum.

[:punct:] Satzzeichen: ! "# $% & '() * +, - /:; < => @ [\]^_` {|} ~

[:space:] Leerzeichen:.?. Tabulator, neue Zeile, vertikal Registerkarte Formularvorschub , Wagenrücklauf, Raum und möglicherweise andere locale abhängigen Zeichen

[:upper:] Großbuchstaben in der aktuellen locale

[:xdigit:] Hexadezimalziffern:.. 0 1 2 3 4 5 6 7 8 9 ABCDEF abcde f.

So können wir die oben wiederholen mit irgendwelchen

dput(grep('[[:space:]]', ch, value = TRUE)) 
# c("\t", "\n", "\v", "\f", "\r", " ") 

dput(grep('[[:alnum:]]', ch, value = TRUE)) 
# c("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", 
# "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", 
# "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", 
# "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", 
# "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z") 

Sie können auch PCRE verwenden

dput(grep('\\s', ch, value = TRUE)) 
# c("\t", "\n", "\v", "\f", "\r", " ") 

dput(grep('\\v|\\h', ch, value = TRUE, perl = TRUE)) 
# c("\t", "\n", "\v", "\f", "\r", " ", "\205", "\240") 

dput(grep('\\p{P}', ch, value = TRUE, perl = TRUE)) 
# c("!", "\"", "#", "%", "&", "'", "(", ")", "*", ",", "-", ".", 
# "/", ":", ";", "?", "@", "[", "\\", "]", "_", "{", "}", "\241", 
# "\247", "\253", "\266", "\267", "\273", "\277") 

oder eigene definieren, etc

dput(grep('[\x20-\x7E]', ch, value = TRUE)) 
dput(grep('[A-c]', ch, value = TRUE)) 
+0

Sehr gründliche Antwort, vielen Dank. Ist es möglich, alle diese Symbole dann in eine lange Zeichenfolge zu setzen? Sie müssten so ziemlich alle Werte zusammen mit paste und lapply verketten? – petergensler

+1

@petergensler; ise 'einfügen (grep ('[[: punct:]]', ch, value = TRUE), collapse =" ")' – user20650

Verwandte Themen