2017-12-18 125 views
6

Tôi có đầu ra của hàm lme trong R.Chuyển đổi tất cả các ma trận trong danh sách thành data.frames trong R

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

Như bạn thấy, một số thành phần của đầu ra (fm2) là ma trận, ví dụ: fm2$varFix

Tôi đang tìm một hàm để chấp nhận đối tượng và chuyển đổi tất cả các ngôn ngữ con thành data.frames.

+0

Sản lượng mong đợi của bạn là gì? Có lẽ 'chổi :: gọn gàng (fm2)' – akrun

+0

Đầu ra là cùng một đối tượng (danh sách) nhưng tất cả ma trận được chuyển đổi sang khung dữ liệu – MyQ

Trả lời

6

Có lẽ như thế này:

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

EDIT: Mặc dù câu trả lời này đã được chấp nhận, tôi đã không hài lòng với giải pháp, vì nó không chuyển đổi ma trận mà nằm trong danh sách đệ quy, và các thuộc tính của các phần tử bị mất. Tôi tin rằng giải pháp sau giải quyết cả hai vấn đề:

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) == "ma trận")) as.data.frame (x) else x}) $ varFix) [1] "data.frame" class (fm2 $ varFix) "matrix" 'Giải pháp hay! –

Các vấn đề liên quan