2017-04-16 11 views
0

Entschuldigung, wenn es irgendwo hier eine Antwort auf meine Frage gab. Leider konnte ich es nicht finden.Gsub, extrahieren bestimmte Anzahl von Ziffern

Ich habe eine Zeichenfolge mit einer folgenden Form "ANNNNNNN.tif", wobei A nur ein Buchstabe ist und N eine Ziffer ist. Es gibt 7 Ziffern in einer Reihe.

new <- c("A2000001.tif" ,"A2000002.tif", "A2000003.tif", "A2000004.tif", "A2000005.tif", "A2000006.tif") 

Ich möchte Jahr und Monat Wert daraus zu bekommen. die ersten 4 Ziffern stehen für das Jahr und die letzten 2 Monate. Z.B. Ich schrieb dies einen Jahreswert zu erhalten

year1 <- gsub("([0-9]){3,4}?.*$", "", new) 
year <- as.numeric(gsub("A", "", year1)) 

Aber ich nehme an, es kürzer geschrieben werden kann, und ich kämpfe noch einen Monat Wert zu erhalten.

UPD: Und ich schrieb dies, um einen Monat zu bekommen.

month1 <- gsub("^*.([0-9]){6,7}?", "\\1", new) 
month <- as.numeric(gsub(".tif", "", month1)) 

Aber noch zu Lernzwecken würde ich gerne wissen, wie man es besser macht.

+0

Versuchen Sie, die Zeichenfolge zu erstellen oder die Ziffern zu extrahieren? Bitte klären Sie. –

+0

Ich habe einen Namen der Dateien: "A2000001.tif" "A2000002.tif" "A2000003.tif" "A2000004.tif" "A2000005.tif" "A2000006.tif" usw. Ich will raus aus dem Jahr und Monat eines Bildes. Also die ersten 4 Ziffern stehen für das Jahr und die letzten 2 Monate. – Valerija

+1

'read.fwf (textConnection (neu), widths = c (1, 4, 3), col.names = c ('Buchstabe', 'Jahr', 'Monat'))' .. äh, nicht sicher was extra 0 ist, wenn dies vermieden werden soll, können Sie es in eine separate Spalte 'read.fwf (textConnection (neu), Breiten = c (1, 4, 1, 2), col.names = c ('l ',' y ',' x ',' m ')) ' – rawr

Antwort

2

Hier, um anzuzeigen, sind einige Basisoptionen:

new <- c("A2000001.tif" ,"A2000002.tif", "A2000003.tif", 
     "A2000004.tif", "A2000005.tif", "A2000006.tif") 

Unter der Annahme, sie immer an den gleichen Positionen innerhalb der Strings sind:

as.integer(substr(new, 2, 5)) 
# [1] 2000 2000 2000 2000 2000 2000 
as.integer(substr(new, 7, 8)) 
# [1] 1 2 3 4 5 6 

Etwas adaptiver, vorausgesetzt, dass sie immer entweder einer Nichtnummer (Jahr) oder einem Punkt (Monat) vorangehen:

as.integer(sub("^[^0-9]([0-9]{4}).*", "\\1", new)) 
# [1] 2000 2000 2000 2000 2000 2000 
as.integer(sub(".*([0-9]{2})\\..*", "\\1", new)) 
# [1] 1 2 3 4 5 6 

Extract alle Zahlen und einige Phantasie-Mathematik auf sie:

x <- as.integer(gsub("[^0-9]", "", new)) 
x %/% 1000 
# [1] 2000 2000 2000 2000 2000 2000 
x %% 100 
# [1] 1 2 3 4 5 6 

Uber mächtige reguläre Ausdrücke Extraktion (https://xkcd.com/1171/):

lapply(
    regmatches(new, 
      gregexpr("(?<![0-9])[0-9]{4}|[0-9]{2}(?![0-9])", new, perl = TRUE)), 
    as.integer 
) 
# [[1]] 
# [1] 2000 1 
# [[2]] 
# [1] 2000 2 
# [[3]] 
# [1] 2000 3 
# [[4]] 
# [1] 2000 4 
# [[5]] 
# [1] 2000 5 
# [[6]] 
# [1] 2000 6 

(Obwohl diese letzte ist eine Liste von Vektoren, etwas anderes Format für Ihren Verbrauch.)

+0

Danke, r2evans! Das ist wirklich detaillierte Antwort! – Valerija

2

tidyr hat sehr leistungsfähige separate, die gut auf Datenrahmen/Datentabellen arbeiten,

new <- c("A2000001.tif" ,"A2000002.tif", "A2000003.tif", "A2000004.tif", "A2000005.tif", "A2000006.tif") 

library(tidyr) 

df <- as.data.frame(new) %>% 
    separate(new, into = c("letter", "year", "extra", "month", "extension"), sep=c(1,5,6,8), remove = FALSE) %>% 
    select(-extra, -extension) 

df   

#   new letter year month 
# 1 A2000001.tif  A 2000 01 
# 2 A2000002.tif  A 2000 02 
# 3 A2000003.tif  A 2000 03 
# 4 A2000004.tif  A 2000 04 
# 5 A2000005.tif  A 2000 05 
# 6 A2000006.tif  A 2000 06 

Das Folgende ist eine typische Vorgehensweise mit gsub in Basis R. In jedem Fall passen Sie so viel von dem führenden Teil des Strings an, dass der interessante Teil beim Einfangen von Klammern mit dem Rest übereinstimmt. Ersetzen durch "\\ 1" der erfasste Wert

new <- c("A2000001.tif" ,"A2000002.tif", "A2000003.tif", "A2000004.tif", "A2000005.tif", "A2000006.tif") 
letter <- gsub("(.).*", "\\1", new) 
year <- as.numeric(gsub(".(\\d{4}).*", "\\1", new)) 
month <- as.numeric(gsub(".\\d{4}.(\\d{2}).+", "\\1", new)) 
+0

Danke, epi99! Sieht praktisch aus! – Valerija

Verwandte Themen