【问题标题】:How to convert a List to Data Frame, but removing the internal List structure?如何将列表转换为数据框,但删除内部列表结构?
【发布时间】:2014-04-24 17:40:05
【问题描述】:

这听起来很简单,但我在尝试将列表转换为数据框时遇到了很多问题。 我用 as.data.frame 函数完成了它并且它可以工作,但是当我使用 str 函数时,内部结构仍然保留在 List 结构。我想选择一个特定的列来处理它。

有一些简单的方法可以将列表转换为数据框,但是使用新的数据框结构? 我也尝试将我的列表取消列出到矩阵中,但我丢失了列名和行名,我必须手动重新放置。

例如,这是我的 List,我想使用并绘制 mystats$p.value 列:

library(gtools)
 x <- rnorm(100, sd=1)
 y <- rnorm(100, sd =2)

mystats <- t(running(x, y, fun = cor.test, width=5, by=5))

谢谢

【问题讨论】:

  • 如果str 说它是一个列表,那么as.data.frame 函数不起作用并且您仍然有一个列表。请添加更多详细信息和/或可重现的示例。
  • 我已经添加了一个示例,我希望得到与@LucaBraglia 的答案相同的结果,但是使用 running() 生成的这种类型的列表

标签: r list dataframe


【解决方案1】:

当且仅当它是 data.frames 的列表时,您可以使用 do.call

al <- split(airquality, airquality$Month)
sapply(al, class)
same.airquality <- do.call(rbind, al)

这里的列表元素具有相同的列结构(对于在列表元素之间“拆分”不同变量的列表,每个相同nrow),您可以使用

do.call(cbind, another.list)

最后(但未测试)用这种方法你could 尝试包abind

编辑

在提供的示例之后,我对您的设置有了更多了解:您应该对cor.test 的调用进行一些处理,因为使用running 它会使数据有点混乱(目前您正在尝试放置一个列表,一个复杂的数据结构, 在一个类似对象的矩阵中)

foobar <- function(x,y) {
    my.test <- cor.test(x,y)

    ## look at values returned by names(cor.test) or ?cor.test for
    ## which object you can export                                      

    c(my.test$statistic, my.test$p.value, my.test$conf.int)

}

## mystats is a matrix                                                          
mystats <- as.data.frame(t(running(x, y, fun = foobar, width=5, by=5)))
names(mystats) <- c("statistic", "p.value", "low.ci", "up.ci")
mystats$p.value

如果你有多个像这样的对象,例如

mystats$row <- row.names(mystats)
mystats$rep <- 1
row.names(mystats) <- NULL                                          
mystats2 <- mystats
mystats2$rep <- 2
asd <- list(mystats, mystats2)
foo <- do.call("rbind", asd )
foo
foo$p.value

HTH

【讨论】:

  • 感谢@LucaBraglia,这正是我需要的结果,但我在问题中添加了 List 示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2019-11-16
  • 2020-07-29
  • 2018-03-14
  • 2020-04-17
相关资源
最近更新 更多