将列表转换为一行数据框

8

我有一个像这样的列表:

arg0 <- list(code = "a", n = rep(10, 3))
  • 列表中的对象数量是可变的。列表的对象是向量--只有一维的对象。
  • 我想要创建一个程序,将列表转换为如下的单行数据框:
> 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)
3个回答

11

这是一种方法:

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

这样做不起作用,因为它会使10成为一个因子。 x <- list(code = "a", n = rep(10, 3)) xx <- data.frame(t(unlist(x))) sapply(xx, typeof) sapply(xx, class) - Tal Galili

9
如果您想要保留列表对象的不同数据类型,可以使用以下命令:
data.frame(lapply(arg0, function(x) t(data.frame(x))))

输出结果:
  code n.1 n.2 n.3
x    a  10  10  10

第二到第四列的值仍然是数字。

因为保留数据类型而被接受——这是我在问题中没有提到但却在考虑的额外特性。 R 中对象命名的组织方式让我感到惊讶。在这两个例子中,不同的行名称被分配给了相同的结果:foo <- function(x) t(data.frame(x)); foo(arg0[[1]])t(data.frame(arg0[[1]]))。我也不知道 lapply 会保留参数列表中的对象名称。感谢您教育性的回答! - djhurio
另一个类似的解决方案:data.frame(lapply(arg0, function(x) t(matrix(x)))) - Tal Galili

3

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

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

这不起作用,因为它会使10成为一个因子。x <- list(code = "a", n = rep(10, 3)) xx <- data.frame(t(unlist(x))) sapply(xx, typeof) sapply(xx, class) - Tal Galili
@TalGalili read.table 会以通常的方式重新解释数据。 - James
但这取决于read.table在字符向量上做出良好选择。如果n有一个因子,它会起作用吗? - Tal Galili
如果默认选择不合适,您可以使用 colClasses 和在一定程度上使用的 stringsAsFactors 来指定选项。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接