有问题.我需要将一个不规则的列表列表转换为宽格式的data.frame(即我需要相同数量的行),我只是无法弄清楚如何做到这一点.列表看起来像这样:
[[1]]
[1] 14
[[2]]
[1] 26
[[3]]
[1] 20 21 22 23
[[4]]
[1] 21 22
[[5]]
[1] 25
[[6]]
[1] 17 21 23
Run Code Online (Sandbox Code Playgroud)
我尝试过使用for循环和/或sapply的各种方法,但没有任何作用.不同长度的列表元素排除了我所做的任何尝试.在我看来,必须有一种相当直接的方法来做到这一点.一定不是吗?任何人都可以建议吗?
这是一个lapply/ mapply例子......
# Data
set.seed(1)
ll <- replicate( 4 , runif( sample(4,1) ) )
str(ll)
#List of 4
# $ : num [1:2] 0.372 0.573
# $ : num [1:4] 0.202 0.898 0.945 0.661
# $ : num [1:3] 0.0618 0.206 0.1766
# $ : num [1:3] 0.384 0.77 0.498
# Find length of each list element
len <- sapply(ll,length)
# Longest gives number of rows
n <- max( len )
# Number of NAs to fill for column shorter than longest
len <- n - len
# Output
mapply( function(x,y) c( x , rep( NA , y ) ) , ll , len )
# [,1] [,2] [,3] [,4]
#[1,] 0.3721239 0.2016819 0.06178627 0.3841037
#[2,] 0.5728534 0.8983897 0.20597457 0.7698414
#[3,] NA 0.9446753 0.17655675 0.4976992
#[4,] NA 0.6607978 NA NA
Run Code Online (Sandbox Code Playgroud)
注意,输出是一个矩阵,所以你需要用输出包装data.frame().
data.frame( t( mapply( function(x,y) c( x , rep( NA , y ) ) , ll , len ) ) )
# X1 X2 X3 X4
#1 0.37212390 0.5728534 NA NA
#2 0.20168193 0.8983897 0.9446753 0.6607978
#3 0.06178627 0.2059746 0.1765568 NA
#4 0.38410372 0.7698414 0.4976992 NA
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
983 次 |
| 最近记录: |