2016-12-08 9 views
1

Ich habe über 10000 Dateien. Ich stelle zuerst mein Verzeichnis auf den Ordner, in dem sich die Dateien befinden.Wie kann ich eine sehr große Liste manipulieren

Dann mache ich einen Link zu der alle Dateien mit .txt Format wie dieses

filenames <- list.files("path to the file", pattern="*.txt", full.names=TRUE) 

Dann las ich es mit fread

ldf<- lapply(filenames, FUN=fread, header=TRUE) 

Warum fread? tatsächlich, wenn ich data.table verwende, vermasselt es zum Beispiel dann muss ich hinzufügen sep"," und row.names=FALSE etc. Wenn Sie einen besseren Weg kennen, beraten Sie sich bitte. In jedem Fall

Nachdem ich dies tat, habe ich am Ende mit einer riesigen Liste, den ich jetzt benötigen, um Daten daraus zu extrahieren. Als Beispiel habe ich versucht, ein repräsentativen Daten zu machen unter

Natürlich in realen Daten, gibt es viel viel mehr Spalten in jeder Datei, gibt es nur drei genannte check und myfile und Myname

Jetzt habe ich versucht zu halten nur Spalte myfile und Myname durch den folgenden Befehl, der es nicht geschafft hat.

t<- lapply(ldf, `[`, c(2,3)) 



my.list <- list(structure(list(check = c(FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE), myfile = c("", "1xLabel:13C(6)15N(4) [R11]", "1xOxidation [M7]", 
"", "1xLabel:13C(6)15N(4) [R11]", ""), myname = c("Q9Y383", "Q9Y383", 
"Q9Y383", "Q15366-2", "Q15366-2", "Q15366-2")), .Names = c("check", 
"myfile", "myname"), row.names = c(NA, -6L), class = c("data.table", 
"data.frame")), structure(list(
    check = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE 
    ), myfile = c(NA, NA, NA, NA, NA, NA, NA), Myname = c("F8W727", 
    "O76021", "P46783", "P35527", "Q96C45", "Q9Y383", "Q9Y383" 
    )), .Names = c("check", "myfile", "myname"), row.names = c(NA, 
-7L), class = c("data.table", "data.frame")), 
    structure(list(check = c(FALSE, FALSE, FALSE, FALSE, FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), myfile = c("", 
    "2xLabel:13C(6)15N(4) [R6; R8]; 1xCarbamidomethyl [C4]", 
    "", "", "", "1xCarbamidomethyl [C1]", "", "", "", "", "1xLabel:13C(6)15N(4) [R6]; 1xCarbamidomethyl [C5]" 
    ), myname = c("P39019", "A2A3R5; P62753", "Q8IYB3; E9PCT1; M0R088; A9Z1X7; Q8IYB3-2", 
    "S4R3J4; O43390-3; B4DT28; O43390; O43390-2; O60506; O60506-2; E7ETM7", 
    "P07910-4; B4DY08; G3V4C1; P07910-2; G3V4W0; P07910; G3V5V7; P07910-3; G3V2D6; G3V2Q1", 
    "D6R9X9; D6RG19; P61927", "Q00839", "G3XAD8; H0YGI8; P31948; F5H0T1", 
    "Q8IYB3; E9PCT1; M0R088; A9Z1X7; Q8IYB3-2", "P42766", "Q9NX58; D6RDJ1" 
    )), .Names = c("check", "myfile", "myname"), row.names = c(NA, 
    -11L), class = c("data.table", "data.frame")), 
    structure(list(check = c(FALSE, FALSE, FALSE, FALSE, FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), myfile = c("", 
    "", "", "", "1xLabel:13C(6)15N(4) [R7]", "", "", "", "3xLabel:13C(6)15N(4) [R1; R7; R10]", 
    "", ""), myname = c("P61247", "P39019", "Q9NWH9", "P62917", 
    "P62917", "E9PCT1", "Q15149", "Q14152", "Q14152", "Q15020", 
    "Q02543")), .Names = c("check", "myfile", "myname"), row.names = c(NA, 
    -11L), class = c("data.table", "data.frame"))) 

Was möchte ich?

ich überprüfen möchten, ob ich myfile und myname in allen Dateien geladen ich? und dann einen Ausgang wie folgt haben

file1    file2     file3     file4 
myfile myname  myfile myname  myfile myname  myfile myname 
info  info   info  info  info info  info  info 

Um es reproduzierbarer zu machen. Ich möchte das Beispiel Datenausgabe wie sein unter

myout<- structure(list(myfile1 = structure(c(NA, 1L, 2L, NA, 1L, NA, 
NA, NA, NA, NA, NA), .Label = c("1xLabel:13C(6)15N(4) [R11]", 
"1xOxidation [M7]"), class = "factor"), Myname1 = structure(c(2L, 
2L, 2L, 1L, 1L, 1L, NA, NA, NA, NA, NA), .Label = c("Q15366-2", 
"Q9Y383"), class = "factor"), myfile2 = c(NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA), Myname2 = structure(c(1L, 2L, 4L, 3L, 
5L, 6L, 6L, NA, NA, NA, NA), .Label = c("F8W727", "O76021", "P35527", 
"P46783", "Q96C45", "Q9Y383"), class = "factor"), myfile3 = structure(c(NA, 
3L, NA, NA, NA, 1L, NA, NA, NA, NA, 2L), .Label = c("1xCarbamidomethyl [C1]", 
"1xLabel:13C(6)15N(4) [R6]; 1xCarbamidomethyl [C5]", "2xLabel:13C(6)15N(4) [R6; R8]; 1xCarbamidomethyl [C4]" 
), class = "factor"), Myname3 = structure(c(5L, 1L, 8L, 10L, 
4L, 2L, 7L, 3L, 8L, 6L, 9L), .Label = c("A2A3R5; P62753", "D6R9X9; D6RG19; P61927", 
"G3XAD8; H0YGI8; P31948; F5H0T1", "P07910-4; B4DY08; G3V4C1; P07910-2; G3V4W0; P07910; G3V5V7; P07910-3; G3V2D6; G3V2Q1", 
"P39019", "P42766", "Q00839", "Q8IYB3; E9PCT1; M0R088; A9Z1X7; Q8IYB3-2", 
"Q9NX58; D6RDJ1", "S4R3J4; O43390-3; B4DT28; O43390; O43390-2; O60506; O60506-2; E7ETM7" 
), class = "factor"), myfile4 = structure(c(NA, NA, NA, NA, 1L, 
NA, NA, NA, 2L, NA, NA), .Label = c("1xLabel:13C(6)15N(4) [R7]", 
"3xLabel:13C(6)15N(4) [R1; R7; R10]"), class = "factor"), Myname4 = structure(c(3L, 
2L, 9L, 4L, 4L, 1L, 8L, 6L, 6L, 7L, 5L), .Label = c("E9PCT1", 
"P39019", "P61247", "P62917", "Q02543", "Q14152", "Q15020", "Q15149", 
"Q9NWH9"), class = "factor")), .Names = c("myfile1", "Myname1", 
"myfile2", "Myname2", "myfile3", "Myname3", "myfile4", "Myname4" 
), class = "data.frame", row.names = c(NA, -11L)) 
neue Anfrage

Dann möchte ich die Daten in zwei Datenrahmen spalten. Man hält nur die Mynames, dass ihre Meinedat besondere Saiten genannt df1 und eine solche Mynames, die ihre myfiles haben nichts oder nicht jene speziellen Strings

df1<- structure(list(myname1 = structure(c(3L, 2L, 1L, 1L), .Label = c("", 
"Q15366-2", "Q9Y383"), class = "factor"), myname2 = c(NA, NA, 
NA, NA), myname3 = structure(c(1L, 3L, 4L, 2L), .Label = c("A2A3R5", 
"D6RDJ1", "P62753", "Q9NX58"), class = "factor"), myname4 = structure(c(2L, 
3L, 1L, 1L), .Label = c("", "P62917", "Q14152"), class = "factor")), .Names = c("myname1", 
"myname2", "myname3", "myname4"), class = "data.frame", row.names = c(NA, 
-4L)) 


df2 <- structure(list(myname1 = structure(c(3L, 3L, 2L, 2L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), .Label = c("", "Q15366-2", "Q9Y383"), class = "factor"), 
    myname2 = structure(c(2L, 3L, 5L, 4L, 6L, 7L, 7L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L), .Label = c("", "F8W727", "O76021", "P35527", "P46783", 
    "Q96C45", "Q9Y383"), class = "factor"), myname3 = structure(c(29L, 
    33L, 11L, 18L, 1L, 34L, 35L, 22L, 6L, 20L, 21L, 23L, 4L, 
    10L, 27L, 7L, 2L, 25L, 15L, 24L, 16L, 26L, 13L, 14L, 8L, 
    9L, 31L, 8L, 9L, 31L, 32L, 17L, 3L, 28L, 12L, 33L, 11L, 19L, 
    5L, 34L, 30L), .Label = c(" A9Z1X7", " G3V4C1", " H0YGI8", 
    " O60506-2 ", "A9Z1X7", "B4DT28", "B4DY08", "D6R9X9", "D6RG19", 
    "E7ETM7", "E9PCT1", "F5H0T1", "G3V2D6", "G3V2Q1", "G3V4W0", 
    "G3V5V7", "G3XAD8", "M0R088", "M0R088 ", "O43390", "O43390-2", 
    "O43390-3", "O60506", "P07910", "P07910-2 ", "P07910-3 ", 
    "P07910-4", "P31948", "P39019", "P42766", "P61927", "Q00839", 
    "Q8IYB3", "Q8IYB3-2", "S4R3J4"), class = "factor"), myname4 = structure(c(4L, 
    3L, 10L, 5L, 2L, 9L, 7L, 8L, 6L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", 
    "E9PCT1", "P39019", "P61247", "P62917", "Q02543", "Q14152", 
    "Q15020", "Q15149", "Q9NWH9"), class = "factor")), .Names = c("myname1", 
"myname2", "myname3", "myname4"), class = "data.frame", row.names = c(NA, 
-41L)) 
+0

'my.list' wirft Fehler. – Sotos

+0

'Fehler: unerwartete '<' in: "c (NA, -11L), cla"' – Sotos

+0

@akrun warum hast du wieder deine Antwort entfernen !!!! – nik

Antwort

2

Hier ist ein Ansatz. Sie können die Spaltennamen später ändern und weitere kosmetische Änderungen vornehmen, die Ihnen gefallen. Dies soll zum Kern Ihres Problems kommen, Sie können es nach Ihren Wünschen gestalten. Ich schrieb eine Hilfsfunktion add_rows, die drei Argumente nimmt; ein Datenrahmen, Anzahl der hinzuzufügenden Zeilen und was sie zu füllen sind.

library(data.table) 
#version 1.10+ 

#Helper function to add extra rows 
add_rows <- function(DT, n, fill='') { 
    rbindlist(list(DT, data.table(myfile=rep(fill,n), Myname=rep(fill,n)))) 
} 

#Remove first column 
lst2 <- lapply(my.list, function(x) x[, c("myfile", "myname")]) #if using version <= 1.9.8, x[, -1, with=FALSE] 

#data table with most rows 
len <- max(sapply(lst2, nrow)) 

#Add rows 
lst3 <- lapply(lst2, function(x) add_rows(x, len-nrow(x))) 

#Order rows 
#braces have backslashes added because without them those characters have special meaning in searches 
tofind <- c("13C\\(6\\)15N\\(4\\)", "13C\\(6\\)") 
lst4 <- lapply(lst3, function(DT) { 
    pattern <- paste0(tofind, collapse="|") 
    moveup <- DT[, grep(pattern, myfile)] 
    myorder <- c(moveup, setdiff(1:nrow(DT), moveup)) 
    DT[myorder] 
}) 

#Combine data 
newdf <- do.call('cbind', lst4) 

#Update names 
setnames(newdf, paste0(names(newdf), rep(1:table(names(newdf))[1], each=2))) 

newdf 
+0

Nizza sein, ich nicht, dass die Indizierung mit '-1' Arbeiten wusste so ich versuchte,' bind_cols() 'und tun so etwas wie' new_df [c (F, T, T)] '... – Sotos

+0

Ich werde das bearbeiten. Ich erinnere mich gerade, dass Sie wegen des Buchungsproblems für das Beispiel zu "data.frame" gewechselt haben. Sie arbeiten tatsächlich mit Datentabellen. –

+0

Ist der Fehler mit dem Beispiel? –

Verwandte Themen