2016-09-26 7 views
0

목표

폴더에 100 개의 hdf5 파일이 있습니다. 재현 예를 들어의 즉 단지 2 파일을 살펴 보자 :여러 파일을 읽고 R에서 단일 파일을 만드는 방법은 무엇입니까?

> list.files(pattern="*.hdf5") 
[1] "Cars_20160601_01.hdf5" "Cars_20160601_02.hdf5" 

각 HDF5 파일은 2 개 그룹, dataframe이 포함되어 있습니다. data 그룹에서 2 개의 개체를 추출하고 싶습니다. 이들은 VDS_Veh_SpeedVDS_Chassis_CG_Position입니다. 마찬가지로 frame 그룹에는 3 개의 개체가 있습니다. 이 그룹에는 객체 frame 만 관련됩니다.
이 파일을 읽고 위에서 설명한 관련 변수를 추출하고 싶습니다.

내가 시도하는 것 :

# 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) 
} 

지금, 지구 환경의 모든 파일을 가지고 있기 때문에, 나는 여분의 객체를 제거하고 오직 새 DFS 유지 : 마지막으로

# Remove extra objects 
rm(data, df, ED, frame, i, temp) 

을, I 환경에서 dfs 목록을 만들고 단일 데이터 프레임을 만들었습니다.

DF_obj <- lapply(ls(), get) 
fdc <- do.call("rbind", DF_obj) 

나. 그러나 의견에서 언급 한 바와 같이 assign은 피해야합니다. 또한 수동으로 rm()을 사용해야하는데이 코드가 없으면이 코드가 작동하지 않습니다. 이 문맥에서 assign을 피할 수있는 방법이 있습니까? https://1drv.ms/f/s!AsMFpkDhWcnw6g7StJp9dzZ-nCr4

+1

'fortunes :: fortune (236)' – alistaire

+0

@alistaire 그게 무슨 뜻입니까? –

+0

[fortunes] (https://cran.r-project.org/web/packages/fortunes/index.html) 패키지의 인용문으로,'assign'을 피하는 것이 가장 좋습니다. – alistaire

답변

2

대답은하지만, 몇 가지 사소한 변경, 기본적으로 코드와 동일합니다 : 당신은 데이터 파일이 필요하면

, 여기에 위에서 언급 한 2에 대한 링크입니다. 우리는 목록을 사용하고 assign()을 사용하여 글로벌 환경에서 데이터 프레임을 만드는 대신 목록의 요소에 보통 할당합니다. 이렇게하면 잠재적 인 버그, 이름 충돌 및 대규모 정리에 대해 걱정할 필요가 없습니다.

temp = list.files(pattern="*.hdf5") 
df_list = list() # initialize a list 

# Read all files into a list of data frames 
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 

    # assign to the list. We can take care of the id cols automatically 
    df_list[[i]] <- df 
} 

names(df) <- unique(temp) 
fdc <- data.table::rbindlist(df_list, idcol = "file.ID") 

data.table::rbindlist을 사용하면 do.call(rbind)를 사용하는 것보다 더 빨리, 그리고 목록의 이름을 기반으로 우리를 위해 ID 열을 담당합니다.

+0

답변 해 주셔서 감사합니다. 그러나 이것은 루프의'i'가'unique (temp)'를 사용하기 때문에 파일의 이름이기 때문에 작동하지 않습니다. 그래서,'df_list [[i]] <- df'는 에러를 던집니다. 이것이'assign '을 사용하려고 한 이유입니다. –

+0

왜 작동하지 않습니까? 어떤 오류입니까? 'my_list = list(); my_list [[ "item_one"]] = mtcars; my_list [[ "your_filename.hdf5"]] = 아이리스; i = "another_filename.hdf5"; my_list [[i]] <- data.frame (x = 1 : 2)'은 잘 동작합니다. – Gregor

+0

@umairdurrani 루프 앞의 목록을 초기화하는'df_list = list()'줄을 건너 뛰었습니까 ?? – Gregor