不同长度向量合并为dataframe - list转dataframe

># 构造列表
> (a_list = list(
+   c(1, 1, 2, 5, 14, 42), 
+   month.abb,
+   c(1, 1, 2, 5, 14, 42, 22,88, 0)))
# [[1]]
# [1]  1  1  2  5 14 42
# 
# [[2]]
#  [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
# 
# [[3]]
# [1]  1  1  2  5 14 42 22 88  0

> 
> do.call(cbind, lapply(lapply(a_list, unlist), `length<-`, max(lengths(a_list))))
#       [,1] [,2]  [,3]
#  [1,] "1"  "Jan" "1" 
#  [2,] "1"  "Feb" "1" 
#  [3,] "2"  "Mar" "2" 
#  [4,] "5"  "Apr" "5" 
#  [5,] "14" "May" "14"
#  [6,] "42" "Jun" "42"
#  [7,] NA   "Jul" "22"
#  [8,] NA   "Aug" "88"
#  [9,] NA   "Sep" "0" 
# [10,] NA   "Oct" NA  
# [11,] NA   "Nov" NA  
# [12,] NA   "Dec" NA  
> 
> #当给合并后的data.frame每一列的命名时,则必须使用函数"cbind.data.frame"
> setNames(do.call(cbind.data.frame, lapply(lapply(a_list, unlist), `length<-`, max(lengths(a_list)))), paste0("V", 1:3))
#    V1  V2 V3
# 1   1 Jan  1
# 2   1 Feb  1
# 3   2 Mar  2
# 4   5 Apr  5
# 5  14 May 14
# 6  42 Jun 42
# 7  NA Jul 22
# 8  NA Aug 88
# 9  NA Sep  0
# 10 NA Oct NA
# 11 NA Nov NA
# 12 NA Dec NA
> 
> #当列表中的元素已被命名,则既可使用"cbind.data.frame",也可使用"cbind"
> names(a_list) = c("cat", "months", "dog")
> do.call(cbind, lapply(lapply(a_list, unlist), `length<-`, max(lengths(a_list))))
#       cat  months dog 
#  [1,] "1"  "Jan"  "1" 
#  [2,] "1"  "Feb"  "1" 
#  [3,] "2"  "Mar"  "2" 
#  [4,] "5"  "Apr"  "5" 
#  [5,] "14" "May"  "14"
#  [6,] "42" "Jun"  "42"
#  [7,] NA   "Jul"  "22"
#  [8,] NA   "Aug"  "88"
#  [9,] NA   "Sep"  "0" 
# [10,] NA   "Oct"  NA  
# [11,] NA   "Nov"  NA  
# [12,] NA   "Dec"  NA  

猜你喜欢

转载自blog.csdn.net/nixiang_888/article/details/112859643