如何将矩阵(或列表)转换为data.frame

时间:2014-06-09 16:58:25

标签: r list dataframe

我有一个包含不同类型的列表。它们以矩阵形式排列:

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        

那么如何摆脱额外级别的列表呢?

2 个答案:

答案 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
相关问题