如何将List转换为数据框,但删除内部List结构?

时间:2014-04-24 17:40:06

标签: r list dataframe

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

有一些简单的方法可以将List转换为数据框,但是有一个新的数据框架结构? 我已尝试将我的List列入矩阵,但我丢失了colnames和rownames,我必须再次手动放入。

例如,这是我的列表,我想使用并绘制 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))

由于

1 个答案:

答案 0 :(得分:1)

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

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

这里列表元素具有相同的列结构(对于列表&#34;拆分&#34;列表元素中的不同变量,每个都是相同的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