Objective
I have 100 hdf5 files in a folder. For a reproducible example let's consider only 2 files, namely:
> list.files(pattern="*.hdf5")
[1] "Cars_20160601_01.hdf5" "Cars_20160601_02.hdf5"
Each hdf5 file contains 2 groups, data
and frame
. I want to extract out 2 objects from data
group. These are called VDS_Veh_Speed
and VDS_Chassis_CG_Position
. Similarly, in the frame
group there are 3 objects. Only the object frame
is relevant in this group.
I want to read these files and extract the relevant variables described above.
What I tried:
# Create a list all the hdf5 files
temp = list.files(pattern="*.hdf5")
# Read all files and create data frames from each using the file name as df name
for (i in unique(temp)){
data <- h5read(file = i, name = "data") # ED data
frame <- h5read(file = i, name = "frame") # Frame numbers
ED <- data.frame(frames = frame$frame,
speed.kph.ED = round(data$VDS_Veh_Speed*1.46667*0.3048*3.6,2),
pedal_pos = data$CFS_Accelerator_Pedal_Position)#fps
df <- h5read(file = i, name = "data/VDS_Chassis_CG_Position")
df <- as.data.frame(df)
colnames(df) <- c("y", "x", "z")
df$speed <- ED$speed.kph.ED
df$pedal_pos <- ED$pedal_pos
df$file.ID <- i
assign(i, df)
}
Now, because I have all the files in the Global environment, I removed the extra objects and only kept the new dfs:
# Remove extra objects
rm(data, df, ED, frame, i, temp)
Finally, I made a list of the dfs in the environment and then created a single data frame:
DF_obj <- lapply(ls(), get)
fdc <- do.call("rbind", DF_obj)
This works for me. But, as mentioned in the comments, assign
should be avoided. Also, I have to manually use rm()
, without which this code won't work. Is there any way to avoid assign
in this context?
If you need the data files, here is the link to the 2 mentioned above: https://1drv.ms/f/s!AsMFpkDhWcnw6g7StJp9dzZ-nCr4