我正在使用 进行一些数据操作tapply()
,它返回一个list
类似对象。例如:
x <- 1:10
y <- rep(c('A', 'B'), each = 5)
lst.1 <- tapply(x, y, function(vec) return(vec), simplify = FALSE)
lst.1
# $A
# [1] 1 2 3 4 5
#
# $B
# [1] 6 7 8 9 10
我想把它改造成data.frame
. 直觉正在使用as.data.frame()
,但失败了。
as.data.frame(lst.1)
# lst1
# A 1, 2, 3, 4, 5
# B 6, 7, 8, 9, 10
我手动创建另一个列表来模仿lst.1
,并按as.data.frame()
加速方式工作。
lst.2 <- list(A = 1:5, B = 6:10)
lst.2
# $A
# [1] 1 2 3 4 5
#
# $B
# [1] 6 7 8 9 10
as.data.frame(lst.2)
# A B
# 1 1 6
# 2 2 7
# 3 3 8
# 4 4 9
# 5 5 10
lst.1
和 和有什么区别lst.2
?tapply
以及如何正确地将(ie )返回的列表转换lst.1
为data.frame
?
如果您查看 返回的列表的结构
tapply()
,您会发现它有一个维度属性,并且是一个列表和一个数组。这意味着当您调用
as.data.frame()
在后台分派的方法时 isas.data.frame.array()
和 notas.data.frame.list()
。为了解决这个问题,您可以直接调用您想要使用的方法:或者使用:
从
?tapply
:因此,
lst.1
实际上更接近于array
,尽管它看起来像list
。下表显示了它们在class
、dim
、 和方面的一些差异dimnames
。class()
dim()
dimnames()
lst.2
"list"
lst.1
"array"
[1]“A”“B”
转换
lst.1
为 data.frame 的两种解决方案:显式调用
as.data.frame
类的方法'list'
:用于
c()
将列表数组解开为普通列表:输出