2015-01-22 3 views
1

제가 함께, 말하자면, 변수의 수 100 개 관측 기술 필드들을 포함하는 MATLAB 구조체를 가지고MATLAB 구조체를 R 데이터 프레임에로드하는 방법은 무엇입니까? (MATLAB 출력)은 다음과 같이

I이 데이터 R을 사용할
mystruct = 

    fieldA: [100x1 double] 
    fieldB: [100x1 double] 
    fieldC: [100x1 double] 
    fieldD: [100x1 char] 
    fieldE: {100x1 cell} 

, 그래서 구조체를 .mat 파일로 저장합니다. 패키지를 사용하여 가져옵니다. 내가 R에 새로 온 사람 때문에 다음 가능성이 서투른,하지만 난 잘 개별 필드 (R 코드)에 액세스 할 수 있습니다

> f = readMat('myfile.mat') 
> data = f$mystruct 
> data 
    , , 1 

     [,1]   
    fieldA Numeric,100 
    fieldB Numeric,100 
    fieldC Numeric,100 
    fieldD Character,100 
    fieldE List,100 

> data = data[, , 1] 
> df <- data.frame(fieldA = data$fieldA, fieldB = data$fieldB) 

확인을, 그래서 여기에 질문 : 어떻게 위의 있도록 일반화 할 수 있습니다 원래 구조체의 임의의 수의 필드에 대해 데이터 프레임이 생성됩니까? 필자의 5 개 필드 예제에서는 수동으로 처리 할 수 ​​있지만 다음 데이터 세트에는 많은 필드가 있으므로이 필드를 모두 입력하고 싶지는 않습니다.

this question에 따르면, 나는 틀린 크기의 데이터 프레임 (각각 1 변수의 401 obs와 105 변수의 401 obs)을 구성하는 rbind()ldply()을 시도했습니다.

+0

'데이터'에 무엇이 있는지에 따라 다르지만 (아마도'str (data)'의 출력을 게시 할 수 있습니다), 아마도'df <- as.data.frame (data)'만 있으면됩니다. – Ista

+0

'data '지금 포함된다; 이렇게하면 100 obs의 104 변수를 가진 데이터 프레임이 생깁니다 (5 개의 변수 중 100 obs이어야합니다) –

+2

FieldE는 길이가 1 인 변수 1 개가 아닌 길이 1의 변수 100 개로 변환됩니다. 'drop = c ("singletonLists")'도움? – koekenbakker

답변

5

결국, MATLAB 셀 배열 (fieldE)이 중첩 목록으로 가져 오기되었습니다. unlist를 사용하여 문제를 돌봐 :

data = lapply(data, unlist, use.names=FALSE) 
df <- as.data.frame(data) # now has correct number of obs and vars 

감사 @koekenbakker을 중요한 포인터이에!