我有一个包含不同类型的列表。它们以矩阵形式排列:
tmp <- list('a', 1, 'b', 2, 'c', 3)
dim(tmp) <- c(2,3)
tmp
[,1] [,2] [,3]
[1,] "a" "b" "c"
[2,] 1 2 3
这是我从另一个更复杂的功能中得到它的形式。
现在我想转置它并转换为data.frame。所以我做了以下几点:
data <- as.data.frame(t(tmp))
data
V1 V2
1 a 1
2 b 2
3 c 3
这看起来很棒。但它的结构错误了:
str(data)
'data.frame': 3 obs. of 2 variables:
$ V1:List of 3
..$ : chr "a"
..$ : chr "b"
..$ : chr "c"
$ V2:List of 3
..$ : num 1
..$ : num 2
..$ : num 3
那么如何摆脱额外级别的列表呢?
答案 0 :(得分:4)
这应该可以解决问题:
df <- data.frame(lapply(data.frame(t(tmp)), unlist), stringsAsFactors=FALSE)
str(df)
# 'data.frame': 3 obs. of 2 variables:
# $ X1: chr "a" "b" "c"
# $ X2: num 1 2 3
内部data.frame()
调用将矩阵转换为两列data.frame,其中包含一个"character"
列和一个"numeric"
列。**
lapply(..., unlist)
剥离了额外的list()
图层。
外部data.frame()
调用会将结果列表转换为您之后的data.frame。
**(好吧,那个中级"character"
列实际上属于"factor"
类,但最终结果没有任何区别。如果你愿意,你可以强制它有类"character"
也为内部stringsAsFactors=FALSE
电话添加了data.frame()
,但我不认为忽视这样做会有所作为......)
答案 1 :(得分:2)
或者这个:
as.data.frame(matrix(unlist(tmp),ncol=2,byrow=TRUE))
您可以检查结果:
str(as.data.frame(matrix(unlist(tmp),ncol=2,byrow=TRUE)))
'data.frame': 3 obs. of 2 variables:
$ V1: Factor w/ 3 levels "a","b","c": 1 2 3
$ V2: Factor w/ 3 levels "1","2","3": 1 2 3