从列表值创建数据框

时间:2015-01-30 17:07:52

标签: r

如果这看起来很愚蠢,请提前抱歉,仍在学习R并仍在学习课程。

我创建了一个以列表格式回送3个值的函数。

我正在尝试“分离”这些值并将它们插入到数据框中以供使用。我希望数据框看起来像这样:

#             | pyro1 | pyro2 | pyro3 |
# baseline0   |       |       |       |
# drop time   |       |       |       |
# drop temp   |       |       |       |
# exo time    |       |       |       |
# baseline1   |       |       |       |
# max temp    |       |       |       |
# baseline2   |       |       |       |

基本上在我的函数上调用lapply后,我留下了一个如下所示的数据框:

test <- data.frame(c(list(10,1025,1000),list(15,1015,1001),list(9,1019,1029)))

其中我有三个列表,每个列表有3个值。我需要每个列表中的所有第一个值都进入上面模板数据框的特定行。

例如:

#             | pyro1 | pyro2 | pyro3 |
# baseline0   | 1025  |  1015 | 1019  |
# drop time   |  10   |  15   | 9     |
# drop temp   | 1000  | 1001  | 1029  |
# exo time    |       |       |       |
# baseline1   |       |       |       |
# max temp    |       |       |       |
# baseline2   |       |       |       |

我已经尝试过使用rbind,认为这会因为某些原因而起作用,但这不起作用,而是给出这样的东西:

#             | pyro1                   | pyro2              | pyro3                |
# baseline0   |list(10.5, 1025, 1023.5) |list(16, 1042, 1036)|list(14.5, 1042, 1038)|
# drop time   |       |       |       |
# drop temp   |       |       |       |
# exo time    |       |       |       |
# baseline1   |       |       |       |
# max temp    |       |       |       |
# baseline2   |       |       |       |

抱歉,我没有这么明确的工作示例,如果您需要更多信息请告诉我,但我认为我的问题有些基本(遗憾)。

此外,我可能会以“不正确”的方式解决问题,很乐意接受有关不同方法的任何建议。

由于

EDIT1 在玩unlist之后,我已经整理了一些丑陋的代码,这些代码为我提供了我正在寻找的格式,但我认为这可能是一种非常迂回的做事方式。

testt <- data.frame(c(list(10,1025,1000),list(15,1015,1001),list(9,1019,1029)))
xxx<-data.frame(unlist(testt))
xx1 <- cbind(xxx[1,1],xxx[4,1],xxx[7,1])
xx2 <- cbind(xxx[2,1],xxx[5,1],xxx[8,1])
xx3 <- cbind(xxx[3,1],xxx[6,1],xxx[9,1])
xx4 <- rbind(xx1,xx2,xx3)
xx4

2 个答案:

答案 0 :(得分:3)

您的意见:

test <- structure(list(list(10.5, 1025, 1023.5), list(16, 1042, 1036), list(14.5, 1042, 1038)), 
                  .Dim = c(1L, 3L), .Dimnames = list( NULL, c("pyro1", "pyro2", "pyro3")))

使用rbind.data.frame并使用do.call将其提供给列表。我们使用setNames设置列名称,但也可以使用names(...) <-

setNames(do.call(rbind.data.frame, test), dimnames(test)[[2]])
#   pyro1 pyro2  pyro3
#2   10.5  1025 1023.5
#21  16.0  1042 1036.0
#3   14.5  1042 1038.0

答案 1 :(得分:0)

在您的示例中,data.frame由列而不是行绑定,但data.frames最好通过列列表,其中每列具有它自己的特定含义和格式,但绑定列表列 - 明智的是这个概念的转换。

所有值都属于同一类(此例中的数字) 你可以将它们行绑定在一起形成一个矩阵,然后将矩阵转换为data.frame

mx <- rbind(list(10,1025,1000),list(15,1015,1001),list(9,1019,1029))
df <- as.data.frame(mx)

如果列表的元素不是同一个类,则可以创建数据 首先是帧,然后将它们行绑定在一起。

df <- rbind(as.data.frame(list(a =10,b=1025,c=1000)),
            as.data.frame(list(a =15,b=1015,c=1001)),
            as.data.frame(list(a =9,b=1019,c=1029)))

请注意,第二种方法可能更可取,因为它会将列表元素的名称保留为data.frame中的字段名称。但是,它确实要求列表具有相同的名称(在这种情况下,&#39; a&#39;&#39;&#39;&#39;&#39; c&#39;)