将特定于函数的对象的值提取到数据帧中

时间:2018-03-21 15:03:52

标签: r tidyr

我试图绘制一个函数的多次运行的结果。该函数返回一个具有不同长度列表的对象。

library(ldbounds)
reas1.lin = bounds(t = c(.5,.75,1),iuse = c(3,3),alpha = c(0.025,0.025))

结果如下:

$bounds.type
[1] 2

$spending.type
[1] "Power Family: alpha * t^phi"

$time
[1] 0.50 0.75 1.00

$time2
[1] 0.50 0.75 1.00

$alpha
[1] 0.025 0.025

$overall.alpha
[1] 0.05

$lower.bounds
[1] -2.241403 -2.288491 -2.229551

$upper.bounds
[1] 2.241403 2.288491 2.229551

$exit.pr
[1] 0.0250 0.0375 0.0500

$diff.pr
[1] 0.0250 0.0125 0.0125

attr(,"class")
[1] "bounds"

我想得到一个如下所示的数据框:

time1 time2 lower.bound upper.bound exit.pr diffpr                        type 
0.50  0.50   -2.241403    2.241403  0.0250 0.0250 Power Family: alpha * t^phi       
0.75  0.75   -2.288491    2.288491  0.0375 0.0125 Power Family: alpha * t^phi       
1.00  1.00   -2.229551    2.229551  0.0500 0.0125 Power Family: alpha * t^phi       

这就是我将数据提取到上面的数据帧的方式,但它取决于每个列表中的元素数量,必须有一个更优雅的解决方案...

example1.lin <- data.frame(matrix(as.numeric(unlist(reas1.lin)[c(3:8,12:23)]), 
                    nrow=3,
                    byrow=F),type=reas1.lin$spending.type)

2 个答案:

答案 0 :(得分:2)

以这种方式:

nms <- c("time", "time2", "lower.bounds", "upper.bounds", "exit.pr", "diff.pr", "spending.type")
as.data.frame(reas1.lin[nms])
#   time time2 lower.bounds upper.bounds exit.pr diff.pr               spending.type
# 1 0.50  0.50    -2.241403     2.241403  0.0250  0.0250 Power Family: alpha * t^phi
# 2 0.75  0.75    -2.288491     2.288491  0.0375  0.0125 Power Family: alpha * t^phi
# 3 1.00  1.00    -2.229551     2.229551  0.0500  0.0125 Power Family: alpha * t^phi

答案 1 :(得分:1)

原来有人比我更快(并使用更少的代码行)。如果您对不需要手动插入列表名称的版本感兴趣,可以执行以下操作:

library(ldbounds)
library(tidyverse)
example1 = bounds(t = c(.5,.75,1),iuse = c(3,3),alpha = c(0.025,0.025))
example1 <- map(example1, `length<-`, max(lengths(example1)))
example1 %>% as_data_frame() %>% fill(everything())

首先,我填充列表中的所有向量与NA是相同的长度,然后我将它们组合到一个数据帧,并在必要时用它们上面的行中的值替换NAs。 仅使用长度分配作为函数的那种古怪而令人惊讶但相当优雅的方式来自对this question的回答。