2012-04-04 11 views
0

Ich frage mich, ob es möglich ist, einen neuen Datenrahmen mit bestimmten Zellen aus jeder Datei aus dem Arbeitsverzeichnis zu erstellen. zum Beispiel sagen, wenn ich 2-Datenrahmen wie diese haben (ignorieren Sie bitte die Zahlen, wie sie zufällig sind):So erstellen Sie eine einzelne Tabelle durch Extrahieren bestimmter Zellen aus mehreren CSV-Dateien

enter image description here

Say in jeden Datensatz, Zeile 4 die Summe meiner Wert ist und Zeile 5 ist die Anzahl der fehlende Werte. Wenn ich Anzahl von Werten als „M“ und Summe der coloumns als „N“ fehlt darstellen, was ich versuche, ist die folgende Tabelle acheive:

enter image description here

So wird jede Datei ‚N‘ und ‚M‘ sind in 1 Reihe.

Ich habe viele Dateien im Verzeichnis, also habe ich sie in einer Liste gelesen, aber nicht sicher, was wäre der beste Weg, um eine solche Aufgabe auf einer Liste von Dateien durchzuführen.

das ist mein Beispielcode für die Tabellen habe ich gezeigt, und wie ich sie in der Liste zu lesen:

##Create sample data 

df = data.frame(Type = 'wind', v1=c(1,2,3,100,50), v2=c(4,5,6,200,60), v3=c(6,7,8,300,70)) 
df2 =data.frame(Type = 'test', v1=c(3,2,1,400,40), v2=c(2,3,4,500,30), v3=c(6,7,8,600,20)) 

# write to directory 
write.csv(df, file = "sample1.csv", row.names = F) 
write.csv(df2, file = "sample2.csv", row.names = F) 

# read to list 
mycsv = dir(pattern=".csv") 
n <- length(mycsv) 

mylist <- vector("list", n) 
for(i in 1:n) mylist[[i]] <- read.csv(mycsv[i],header = TRUE) 

Ich würde wirklich dankbar, wenn Sie mir einen Vorschlag machen könnte wäre es, wenn dies möglich ist und wie ich sollte angehen?

Vielen Dank,
Ayan

+0

Sieht aus wie Sie die 'for' Schleife mit' lapply' ersetzen könnte. Aber lass mich fragen: Sind deine Quelldateien groß? Wenn dies der Fall ist, werfen Sie einen Blick auf 'read.table', mit dem Sie nur die gewünschten Zeilen laden können, anstatt die gesamte Datei. –

Antwort

1

Dies sollte funktionieren:

processFile <- function(File) { 
    d <- read.csv(File, skip = 4, nrows = 2, header = FALSE, 
        stringsAsFactors = FALSE) 
    dd <- data.frame(d[1,1], t(unlist(d[-1]))) 
    names(dd) <- c("ID", "v1N", "V1M", "v2N", "V2M", "v3N", "V3M") 
    return(dd) 
} 

ll <- lapply(mycsv, processFile) 
do.call(rbind, ll) 
#  ID v1N V1M v2N V2M v3N V3M 
# 1 wind 100 50 200 60 300 70 
# 2 test 400 40 500 30 600 20 

(Die eine etwas knifflige/ungewöhnliche Bit kommt in dieser dritten Zeile von processFile() Hier ist ein Code-Schnipsel, die helfen Sie sehen sollen. wie es erreicht, was es tut.)

(d <- data.frame(a="wind", b=1:2, c=3:4)) 
#  a b c 
# 1 wind 1 3 
# 2 wind 2 4 
t(unlist(d[-1])) 
#  b1 b2 c1 c2 
# [1,] 1 2 3 4 
+0

Ich glaube nicht, dass ich völlig verstehe, was das Poster will. Dies scheint passender zu sein als meine Antwort. –

+0

danke für deine antworten, das ist genau was ich gesucht habe! und danke für die klare Erklärung des t (unlist (d [-1])) -Codes, es war wirklich nützlich zu verstehen, wie man mit meinem realen Datensatz umgeht, danke nochmal :))) – Achak

+0

Froh die extra Erklärung geholfen. Ich erkannte, dass ich viele Ideen in diese eine Zeile gepackt hatte, und hoffte, dass die Erweiterung auf etwas davon helfen könnte. –

1

CAVEAT: Ich bin mir nicht sicher, ob ich völlig verstehe, was Sie wollen. Ich denke, Sie lesen in einer Liste und möchten bestimmte Datenrahmen aus dieser Liste mit den gleichen Zeilen aus dieser Liste auswählen. Dann möchten Sie einen Datenrahmen dieser Zeilen erstellen und von Lang- zu Großformat wechseln.

LIST <- lapply(2:3, function(i) { 
     x <- mylist[[i]][4:5, ] 
     x <- data.frame(x, row = factor(rownames(x))) 
     return(x) 
    } 
) 

DF <- do.call("rbind", LIST) #lets you bind an unknown number of rows from a list 
levels(DF$row) <- list(M =4, N = 5) #recodes rows 4 and 5 with M and N 

wide <- reshape(DF, v.names=c("v1", "v2", "v3"), idvar=c("Type"), 
    timevar="row", direction="wide") #reshape from long to wide 

rownames(wide) <- 1:nrow(wide) #give proper row names 
wide 

Dies ergibt:

Type v1.M v2.M v3.M v1.N v2.N v3.N 
1 wind 100 200 300 50 60 70 
2 test 400 500 600 40 30 20 
+0

Hallo, danke für deine Antwort und für den Versuch, mir zu helfen. Die andere Antwort schlägt tatsächlich mein Dataset mehr aber danke noch einmal für Ihre Antwort :) – Achak

Verwandte Themen