【问题标题】:Convert all matrices in a list to data.frames in R将列表中的所有矩阵转换为 R 中的 data.frames
【发布时间】:2018-05-31 13:42:13
【问题描述】:

我在R 中有lme 函数的输出。

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

如您所见,输出的某些元素 (fm2) 是矩阵,例如fm2$varFix

我正在寻找一个函数来接受一个对象并将所有子矩阵转换为data.frames

【问题讨论】:

  • 您的预期输出是什么?也许broom::tidy(fm2)
  • 输出是同一个对象(列表),但是所有的矩阵都转换为数据帧

标签: r list dataframe matrix


【解决方案1】:

可能是这样的:

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)

【讨论】:

  • class(lapply(fm2, function(x) {if(any(class(x)=="matrix")) as.data.frame(x) else x})$varFix) [1] "data.frame" class(fm2$varFix) "matrix" 不错的解决方案!
猜你喜欢
  • 1970-01-01
  • 2015-04-27
  • 2014-05-15
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 2017-03-22
  • 2015-07-24
  • 2018-07-17
相关资源
最近更新 更多