2017-12-18 202 views
6

'daki data.frames dosyasına dönüştürün işlevinin R içinde çıktısını alıyorum. Görüldüğü gibiBir listedeki tüm matrisleri R

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

, çıkış (fm2) bazı unsurları matrisler ör fm2$varFix

Bir nesneyi kabul etmek ve tüm alt öğeleri data.frames'a dönüştürmek için bir işlev arıyorum.

+0

Beklenen çıktınız nedir? Belki de "süpürge :: düzenli (fm2)" – akrun

+0

Çıktı aynı nesnedir (liste) ancak tüm matrisler – MyQ

cevap

6
Belki böyle

:

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

DÜZENLEME: Bu yanıt zaten kabul edildi rağmen yinelemeli listesinde olan matrisler dönüştürmez beri, ben, çözüm ile mutlu değildi ve elemanların özellikleri kaybolur. Aşağıdaki çözümün her iki sorunu da çözdüğüne inanıyorum:

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

'sınıfına dönüştürülür (lapply (fm2, function (x) {if (any (sınıf (x)) == "matrix")) as.data.frame (x) else x}) $ varFix) [1] "data.frame" sınıfı (fm2 $ varFix) "matrix" 'Güzel çözüm! –