2012-11-13 9 views
6

Hat jemand eine Idee über das Importieren der folgenden Daten in R in einer geeigneten Form? Ich versuchte strsplit Funktion als: test <- strsplit(test,"[[:space:]]+") wo Test ist der Name der Datei einschließlich der folgenden unordentlichen Daten. Irgendwie endete ich mit nur einer Zeichenvariablen. Ich hätte gerne acht verschiedene Variablen in geeigneter Form. Kannst du mir bitte Helfen?Importieren von unordentlichen Daten mit R

Black Eagles 01/12 - 12/11 1500 W 7.0 420 48 Away +3 
Blue State 02/18 - 04/21 1293 L 8.0 490 48 Home +1 
Hawks 01/13 - 02/17 1028 L 4.0 46 460 Away 
New Apple 09/23 - 11/23 563 L 3.0 470 47 Home +2 
Black White 07/05 - 09/26 713 L 5.2 500 45 Home +4 
PBO 10/24 - 10/30 1495 L 1.9 47 410 Away 
+1

Woher diese Daten kommen? Ist es möglich, dass ein Tab-Delimiter oder ähnliches im Original vorhanden ist? – mnel

+0

Ja, es gibt Tab-Trennzeichen zwischen den einzelnen Variablen und Leerzeichen zwischen zwei Namen einer Variablen. Dies sind nur Teamstatistiken und jede Spalte sollte eine Variable (9 Variablen) darstellen. Ich konnte nicht herausfinden, da dieser Datensatz String, numerische und Datumsvariablen zusammen enthält. Jede Hilfe wird sehr geschätzt. –

+0

Verwenden Sie dann 'read.table (thedatafile, sep = '\ t')'. Kannst du die Ergebnisse von 'dput (test)' posten (bevor du den strsplit neu zugewiesen hast), und ich kann eine nützliche Antwort posten. – mnel

Antwort

9

Wie ist das?

> nicelyFormatted 
    [,1]   [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] "Black Eagles" "01/12" "12/11" "1500" "W" "7.0" "420" "48" "Away" "+3" 
[2,] "Blue State" "02/18" "04/21" "1293" "L" "8.0" "490" "48" "Home" "+1" 
[3,] "Hawks"  "01/13" "02/17" "1028" "L" "4.0" "46" "460" "Away" NA 
[4,] "New Apple" "09/23" "11/23" "563" "L" "3.0" "470" "47" "Home" "+2" 
[5,] "Black White" "07/05" "09/26" "713" "L" "5.2" "500" "45" "Home" "+4" 
[6,] "PBO"   "10/24" "10/30" "1495" "L" "1.9" "47" "410" "Away" NA 




Hier ist der Code, der verwendet wurde, die obige Tabelle zu erhalten:

library(stringr) 

# Open Connection to file 
pathToFile <- path.expand("~/path/to/file/myfile.txt") 
f <- file(pathToFile, "rb") 

# Read in lines 
rawText <- readLines(f) 


# Find the dahses 
dsh <- str_locate_all(rawText, " - ") 

# Splice, using the dashes as a guide 
lng <- length(rawText) 
spliced <- sapply(1:lng, function(i) 
    spliceOnDash(rawText[[i]], dsh[[c(i, 1)]], dsh[[c(i, 2)]]) 
) 

# make it purtty 
nicelyFormatted <- formatNicely(spliced) 
nicelyFormatted 


#-------------------# 
# FUNCTIONS  # 
#-------------------# 


spliceOnDash <- function(strn, start, end) { 

    # split around the date 
    pre <- substr(strn, 1, start-6) 
    dates <- substr(strn, start-5, end+5) 
    post <- substr(strn, end+6, str_length(strn)) 

    # Clean up 
    pre <- str_trim(pre) 

    # replace all double spaces with single spaces 
    while(str_detect(post, " ")) { 
    post <- str_replace_all(str_trim(post), " ", " ")  
    } 

    # splice on space 
    post <- str_split(post, " ") 

    # if dates are one field, remove this next line 
    dates <- str_split(dates, " - ") 

    # return 
    c(unlist(pre), unlist(dates), unlist(post)) 
} 

# Function to clean up the list into a nice table 
formatNicely <- function(spliced) { 
    lngst <- max(sapply(spliced, length)) 
    t(sapply(spliced, function(x) 
     if(length(x) < lngst) c(x, rep(NA, lngst-length(x))) else x)) 
} 
+0

Großartig! Danke allen, besonders RS. –

+0

kein Schweiß - froh zu helfen –