2017-12-18 1 views
6

lme의 출력이 R에 있습니다. 시피리스트의 모든 행렬을 data.frames로 변환 R

library(nlme) 
fm2 <- lme(distance ~ age + Sex, data = Orthodont, random = ~ 1) 
str(fm2) 

출력 (fm2)의 일부 요소는 예컨대 매트릭스 fm2$varFix

개체를 허용하고 모든 부분 행렬을 data.frames으로 변환하는 함수를 찾고 있습니다.

+0

예상되는 결과는 무엇입니까? 아마도'broom :: tidy (fm2)' – akrun

+0

출력은 같은 객체 (목록)이지만 모든 행렬은 데이터 프레임 – MyQ

답변

6
어쩌면이 같은

:

lapply(fm2, function(x) {if(any(class(x)=="matrix")) as.data.frame(x) else x}) 

편집 :이 답변이 이미 허용되어 있지만이 반복적으로 목록에있는 행렬을 변환하지 않기 때문에, 나는이 솔루션에 만족하지 않았다 및 요소의 속성이 손실됩니다. 다음 해결책으로 두 문제를 해결할 수 있다고 생각합니다.

library(nlme) 
fm2 <- lme(distance ~ age + Sex, data = Orthodont, random = ~ 1) 
str(fm2) 

replace_sub_dataframes <- function(x) 
{ 
    if(any(class(x)=="list")) 
    { 
    x_copy = x 
    attrs = setdiff(names(attributes(x)),"names") 
    x = lapply(x,replace_sub_dataframes) 
    if(length(attrs)>0) 
    { 
     for(i in 1:length(attrs)) 
     { 
     attr(x,attrs[i]) <- replace_sub_dataframes(attr(x_copy,attrs[i])) 
     } 
    } 
    return(x) 
    } 
    else 
    { 
    if(any(class(x)=="matrix")) 
     return(as.data.frame(x)) 
    else 
     return(x) 
    } 
} 

fm3 = lapply(fm2, replace_sub_dataframes) 
+1

으로 변환됩니다. class (lapply (fm2, function (x) {if (any (class (x) $ varFix) [1] "data.frame"클래스 (fm2 $ varFix) "행렬"'좋은 해결책! –