2012-11-26 40 views
5

我有一个这样的名单:转换列表以一行data.frame

arg0 <- list(code = "a", n = rep(10, 3)) 

对象列表中的数目是可变的。列表中的对象是矢量 - 只有一维对象。

我想打一个过程将列表转换成一排data.frame这样的:

> data.frame(code = "a", n.1 = 10, n.2 = 10, n.3 = 10) 
    code n.1 n.2 n.3 
1 a 10 10 10 

我目前这个解决方案:

a <- stack(arg0) 
b <- data.frame(t(a[,1])) 
names(b) <- a[,2] 
b <- data.frame(b) 

哪里b几乎是结果我想实现:

> b 
    code n n.1 n.2 
1 a 10 10 10 

两个问题:

  1. 有没有更优雅的方法来实现结果?
  2. 你有什么想法如何获得重复的姓名的编号,如c(n.1, n.2, n.3)

回答

4

如果你想保持列表中的对象的不同的数据类型,下面的命令可用于:

data.frame(lapply(arg0, function(x) t(data.frame(x)))) 

的输出:

code n.1 n.2 n.3 
x a 10 10 10 

值i n列2到4仍然是数字。

+0

由于保留了数据类型而被接受 - 额外的功能我没有问在问题中,但我正在考虑这个问题。令我吃惊的是,对象的命名是如何在R中组织的。在这两个例子中,不同的行名被分配给相同的结果:'foo < - function(x)t(data.frame(x)); foo(arg0 [[1]])和't(data.frame(arg0 [[1]]))'。也不知道'lapply'保存了参数列表中的对象名称。谢谢你的教育答案! – djhurio

4

您可以在转置的未列出数据上使用write.tableread.table的组合。我已经使用剪贴板作为保存表的中间步骤。

write.table(t(unlist(arg0)),"clipboard") 
read.table("clipboard") 
    code n1 n2 n3 
1 a 10 10 10 
+0

+1获取自然数据类型 –

9

这是一种方式:

data.frame(t(unlist(arg0))) 
# code n1 n2 n3 
# 1 a 10 10 10