2016-08-02 29 views
0

Ich versuche, eine Textdatei wie folgt zu lesen in:Textdatei mit einer Liste Spalte Dataframe

exp1 sample1 2 5 
exp2 sample1 2 3 5 7 
exp1 sample2 1 2 6 

auf einen Datenrahmen mit einer Liste Spalte wie folgt aus:

tibble(exp = c("exp1", "exp2", "exp3"), 
     sample = c("sample1","sample1","sample2"), 
     listdata = list(list(2,5), list(2,3,5,7), list(1,2,6))) 

# A tibble: 3 x 3 
    exp sample listdata 
    <chr> <chr>  <list> 
1 exp1 sample1 <list [2]> 
2 exp2 sample1 <list [4]> 
3 exp3 sample2 <list [3]> 

Der Zweck ist, Verwenden Sie die Metadaten in den ersten beiden Spalten, um die Listen auszuwählen und zu bearbeiten.

Ich kann in den Zeilen als Listen lesen, aber nicht wissen, wie die Metadaten zu trennen:

listdata <- read_lines("list_c_data.txt") %>% strsplit(., " ") %>% tibble() 

Irgendwelche Vorschläge? Ich muß in der Datei Zeile für Zeile lesen, da die Anzahl der Beobachtungen> 100000 sein könnte und die Länge der Liste in jeder Reihe sein könnte> 1000

Antwort

2

Wir die Datei lasen mit read.table/read.csv mit fill = TRUE, dann gather (aus tidyr) die drittletzte Spalte des Datensatzes, um es in 'lang' Format umzugestalten, gruppiert nach 'V1' und 'V2', wir summarise die 'Val' als list und dann rename die Spalten, falls erforderlich.

library(dplyr) 
library(tidyr) 
df1 <- read.table("yourfile.txt", header=FALSE, fill = TRUE) 
gather(df1, Var, Val, V3:ncol(df1), na.rm = TRUE) %>% 
     group_by(V1, V2) %>% 
     summarise(Val = list(Val)) %>% 
     rename(exp=V1, sample = V2, listdata = Val)    

Oder wir können scan die Zeilen, strsplit durch den Raum zu lesen, wandeln die Elemente in ‚lst‘ (Filtern des 1. und 2. out) numeric, während wir die ersten und zweiten Elemente ein rbinddata.frame und erstellen Sie 'lst2' als dritte Spalte.

l1 <- trimws(scan("yourfile.txt", what ="", sep="\n", quiet=TRUE)) 
lst <- strsplit(l1, " ") 
lst2 <- lapply(lst, function(x) as.numeric(x[-(1:2)])) 
d1 <- setNames(do.call(rbind.data.frame, lapply(lst, 
       function(x) x[1:2])), c("exp", "sample")) 
d1$listdata <- lst2 
+0

Vielen Dank. Ich habe beides versucht. Die erste Methode ist für mich einfacher zu verstehen, aber "read.table" scheint die Listenlänge nicht gut zu handhaben - sie schneidet die längere Liste ab und startet stattdessen eine neue Zeile. Ich denke, es verwendet die ersten paar Zeilen, um die maximale Anzahl der zu füllenden Spalten zu bestimmen. Ihre zweite Methode funktioniert gut. Es ist nur ich bin nicht vertraut mit den Basisfunktionen - sie sieht nicht wie etwas aus, das ich mich erinnern kann/Master :-( – Dong

+0

@Dong Ich versuchte Ihr Beispiel und verwendet die 'fill = TRUE' und war in der Lage, die erwartete Ausgabe zu erhalten. – akrun

+0

Ja, es funktioniert für das Beispiel aber wird fehlschlagen, wenn die Listenlängen "2, 4, 3, 4, 9, 3" sind. Die Zeile mit der Listenlänge von "9" wird zur nächsten Zeile gefaltet der Algorithmus, den 'read.table' verwendet, um die Anzahl der Spalten zu bestimmen, ohne zum Ende der Datei zu gehen – Dong