2017-12-18 12 views
6

lmeの出力はRにあります。あなたが見るように、出力(fm2)のいくつかの要素は行列です。たとえば、次のようになります。 fm2$varFix一覧のすべての行列をdata.framesに変換するR

オブジェクトを受け取り、すべての部分行列を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}) 

EDIT:この答えは、すでに承認されているが、それは再帰的にリストにある行列を変換していないので、私は、溶液で幸せではなかったと要素の属性が失われます。私は次の解決策が両方の問題を解決すると信じています:

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) "matrix" 'いいソリューションです! –