So entfernen Sie die letzten n Zeichen aus jedem Element im R-Vektor


106

Ich bin sehr neu in R und konnte online kein einfaches Beispiel dafür finden, wie die letzten n Zeichen aus jedem Element eines Vektors (Arrays?) Entfernt werden können.

Ich komme aus einem Java-Hintergrund. Ich möchte also jedes Element durchlaufen a$dataund die letzten 3 Zeichen aus jedem Element entfernen.

Wie würden Sie vorgehen?

Antworten:


114

Hier ist ein Beispiel dafür, was ich tun würde. Ich hoffe es ist was du suchst.

char_array = c("foo_bar","bar_foo","apple","beer")
a = data.frame("data"=char_array,"data2"=1:4)
a$data = substr(a$data,1,nchar(a$data)-3)

a sollte jetzt enthalten:

  data data2
1 foo_ 1
2 bar_ 2
3   ap 3
4    b 4

Witziger, musste ich ändern , -3um -0den gewünschten Effekt zu erhalten! Ich habe viele Daten mit Datumsangaben, wie zum Beispiel: "2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"- Ja, zwei Zeitzonen zusammen, und die as.Date-Funktion gibt unerwartete Ergebnisse zurück (Tag früher für BST-Datumsangaben). Daher wollte ich den Zeitzonenstempel entfernen tun -0und es verschwindet, zusammen mit Stunden
LucasSeveryn

Beachten Sie auch die Strptime-Funktion. Ich habe jedoch noch keine Zeitzonen verwendet. Ich denke, es könnte es erkennen. Angeblich erkennt "% Z" Zeitzonen. Ich habe auch die Sapply-Funktion entfernt. Ich habe vergessen, wie gerne R seine Funktionen vektorisiert.
nfmcclure

@LucasSeveryn Wenn Sie Zeichenzeitdarstellungen unter Berücksichtigung von Zeitzonen in Datumsangaben konvertieren möchten, bearbeiten Sie diese bitte in Ihrer Frage. Wahrscheinlich gibt es bessere Antworten, mit denen Sie direkt zu den gewünschten Ergebnissen gelangen (z. B. strptime).
Blue Magister

84

Hier ist ein Weg mit gsub:

cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"

4
(+1) Großer Fan von Regex. Es kann auf fast alles angewendet werden.
Rich Scriven

8
Hinweis: Dies gibt die ursprüngliche Zeichenfolge zurück, wenn sie länger als die Anzahl der zu schneidenden Zeichen ist. Überlegen Sie gsub('.{5}$', '', 'abcd').
Tomas Greif

32

Obwohl dies bei der Antwort von @nfmcclure größtenteils dasselbe ist, bevorzuge ich die Verwendung stringr package, da es eine Reihe von Funktionen deren Namen am konsistentesten und beschreibendsten sind als die in Basis R (tatsächlich google ich immer nach "wie man die Anzahl von erhält.") Zeichen in R ", da ich mich nicht an den Namen erinnern kann nchar()).

library(stringr)
str_sub(iris$Species, end=-4)
#or 
str_sub(iris$Species, 1, str_length(iris$Species)-3)

Dadurch werden die letzten 3 Zeichen von jedem Wert bei entfernt Species Spalte entfernt.


21
Mit dem stringrPaket gibt es eine noch einfachere Lösung: str_sub(iris$Species, end=-4)
Jan-Glx

13

Dasselbe kann mit dem stringi- Paket erreicht werden:

library('stringi')
char_array <- c("foo_bar","bar_foo","apple","beer")
a <- data.frame("data"=char_array, "data2"=1:4)
(a$data <- stri_sub(a$data, 1, -4)) # from the first to the last but 4th char
## [1] "foo_" "bar_" "ap"   "b" 

2

Ähnlich wie bei @Matthew_Plourde mit gsub

Verwenden Sie jedoch ein Muster, das auf null Zeichen gekürzt wird, dh geben Sie "" zurück, wenn die ursprüngliche Zeichenfolge kürzer als die Anzahl der zu schneidenden Zeichen ist:

cs <- c("foo_bar","bar_foo","apple","beer","so","a")
gsub('.{0,3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"    ""    ""

Der Unterschied besteht darin, dass der {0,3}Quantifizierer 0 bis 3 Übereinstimmungen angibt, während {3}genau 3 Übereinstimmungen erforderlich sind. Andernfalls wird keine Übereinstimmung gefunden. In diesem Fall wird gsubdie ursprüngliche, nicht geänderte Zeichenfolge zurückgegeben.

NB Verwendung {,3}wäre gleichbedeutend mit {0,3}, ich bevorzuge einfach die letztere Notation.

Weitere Informationen zu Regex-Quantifizierern finden Sie hier: https://www.regular-expressions.info/refrepeat.html

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.