Frage Merge viele Datenrahmen aus CSV-Dateien, wenn ID-Spalte impliziert ist?


Ich möchte eine Reihe von Datenrahmen zusammenführen (weil es scheint, dass viele Operationen einfacher sind, wenn Sie nur mit einem handeln, aber korrigieren Sie mich, wenn ich falsch liege).

Zur Zeit habe ich einen Datenrahmen wie folgt:

ID, var1, var2
A,  2,    2
B,  4,    5
.
.
Z,  3,    2

Jede ID befindet sich in einer einzelnen Reihe mit mehreren Einzelmessungen

Ich habe auch eine CSV-Datei mit wiederholten Messungen für jede ID, wie:

Dateiname = ID_B.csv

time, var4, var5
0,    1,    2
1,    4,    5
2,    1,    6
...

Was ich möchte ist:

ID, time, va1, var2, var4, var5
...
B,  0,    4,   5,    1,    2,
B,  1,    4,   5,    4,    5,
B,  2,    4,   5,    1,    6,
...

Die Spaltenreihenfolge interessiert mich nicht wirklich. Die einzige Lösung, die ich mir vorstellen kann, besteht darin, die ID-Spalte zu jeder CSV-Datei hinzuzufügen und dann durch sie zu callen merge() mehrmals. Gibt es einen eleganteren Ansatz?


19
2017-10-13 18:35


Ursprung


Antworten:


Mein Verständnis ist, dass Sie die ID aus dem Dateinamen extrahieren müssen, und dann die importierte CSV mit dem vorhandenen Datenrahmen zusammenführen.

df1 <- read.csv(textConnection("ID, var1, var2
A,  2,    2
B,  4,    5"))

# assuming the imported csv-files are in working directory
filenames <- list.files(getwd(), pattern = "ID_[A-Z].csv")

# extract ID from filename
ids <- gsub("ID_([A-Z]).csv", "\\1", filenames)

# import csv-files and append ID
library(plyr)
import <- mdply(filenames, read.csv)
import$ID <- ids[import$Var1]
import$Var1 <- NULL

# merge imported csv-files and the existing dataframe
merge(df1, import)  

Ergebnis:

ID var1 var2 time var4 var5
1  B    4    5    0    1    2
2  B    4    5    1    4    5
3  B    4    5    2    1    6

15
2017-10-13 19:23