2016-07-13 19 views
0

Vielleicht wurde diese Frage gestellt, aber ich konnte keine solide Antwort finden, wegen des Musters in meinen Daten - hoffentlich wird es einfach zu beantworten sein. Ich habe Abfragedaten, die Spalten, die wie folgt aussehen:Nummer aus Zelle in R extrahieren

Sample 
1000 RV 
456 LV 
678 A 

Ich möchte die Briefe ausziehen, steckte sie in eine Zelle und die Zahlen in einem anderen, so dass es wie folgt aussehen:

Sample Type 
1000  RV 
456  LV 
678  A 

Wie kann ich das einfach tun, ohne Zelle für Zelle zu gehen?

+2

Does 'tidyr :: getrennt (df verwendet werden, Sample, in = c ("Sample", "Type"), sep = "") 'arbeiten? – Psidom

+1

Es ist auch im Wesentlichen 'read.table (text = dat $ Sample)' – thelatemail

+0

@Psidom funktioniert perfekt. –

Antwort

1

Es gibt viele Möglichkeiten, dies zu erreichen.

  1. gsub

    sample <- c("123ABC", "234CBA", "999ETC") 
    
    a <- gsub("[[:digit:]]","",sample) 
    b <- gsub("[^[:digit:]]", "", my.data) 
    
  2. stringr

    library(stringr) 
    a <- as.numeric(str_extract(sample, "[0-9]+")) 
    b <- str_extract(my.data, "[aA-zZ]+") 
    
  3. Die Art und Weise, dass Psidom in einem Kommentar erwähnt (ich habe es nicht getestet, aber ich vertraue ihm)

+1

Ich habe # 3 von @Psidom verwendet. Sehr einfach und einfach. Danke für Ihre Hilfe. –

0

Dadurch wird ein data.frame mit numerischer Sample Spalte und Zeichen Type Spalte erreicht, wie in Ihrem Beispiel vorgeschlagen. Wie andere bereits erwähnt haben, gibt es viele Möglichkeiten, dies zu erreichen.

sample <- c('1000  RV', 
      '456  LV', 
      '678  A') 

A <- strsplit(sample, '\\s+')    # Split by whitespace. Returns a list 
B <- unlist(A)        # Converts 1:3 list to a 6x1 character vector 
C <- matrix(B, ncol = 2, byrow = T)   # Convert 6x1 character vector to 3x2 matrix 
D <- as.data.frame(C, stringsAsFactors = F) # Convert matrix to data.frame so columns can be different types 

# All together... 
D <- as.data.frame(matrix(unlist(strsplit(sample, '\\s+')), ncol = 2, byrow = T), 
        stringsAsFactors = F) 

D[ ,1] <- as.numeric(D[ ,1])   # Convert first column to numeric, second remains character 
colnames(D) <- c('Sample', 'Type') # Add column names 

> D 
    Sample Type 
1 1000 RV 
2 456 LV 
3 678 A 
> str(D) 
'data.frame': 3 obs. of 2 variables: 
$ Sample: num 1000 456 678 
$ Type : chr "RV" "LV" "A" 
0

Wir sub

df1$Type <- sub("\\d+", "", df1$Sample) 
df1$Type 
#[1] "ABC" "CBA" "ETC" 

Wenn wir brauchen sie als zwei Spalten verwenden können, tstrsplit von data.table kann

library(data.table) 
setDT(df1)[, setNames(tstrsplit(Sample, "\\s+"), c("Sample", "Type"))] 
Verwandte Themen