I have a list in R in which the objects have different lengths.
Is there any way to convert this list into a dataframe? Maybe adding zeros in the shorter length objects.
I would like to be able to display a, b and c as columns and the numbers on the rows.
this is a small example. Later I will have to apply it to a list of 84 objects, each of these will have a long and different length from each other.
prova <- list(a = c(c(1:5), c(2,NaN, 4, 6,7)), b = c(c(6:10), c(NaN ,NaN, 6,7)),
c=c(c(11:15),c(NaN ,NaN, 7.8,8,5,6,3,NaN)))
Thank you!
CodePudding user response:
As the length
of each element is different, we may need to append NA
at the end to make the lengths same by assigning the length
to the max
length of the list element and then convert to data.frame
mx <- max(lengths(prova))
data.frame(lapply(prova, `length<-`, mx))
-output
a b c
1 1 6 11.0
2 2 7 12.0
3 3 8 13.0
4 4 9 14.0
5 5 10 15.0
6 2 NaN NaN
7 NaN NaN NaN
8 4 6 7.8
9 6 7 8.0
10 7 NA 5.0
11 NA NA 6.0
12 NA NA 3.0
13 NA NA NaN
CodePudding user response:
other methods include:
do.call(rbind, data.table::transpose(prova))
[,1] [,2] [,3]
[1,] 1 6 11.0
[2,] 2 7 12.0
[3,] 3 8 13.0
[4,] 4 9 14.0
[5,] 5 10 15.0
[6,] 2 NaN NaN
[7,] NaN NaN NaN
[8,] 4 6 7.8
[9,] 6 7 8.0
[10,] 7 NA 5.0
[11,] NA NA 6.0
[12,] NA NA 3.0
[13,] NA NA NaN
t(plyr::rbind.fill.matrix(sapply(prova, t)))
[,1] [,2] [,3]
1 1 6 11.0
2 2 7 12.0
3 3 8 13.0
4 4 9 14.0
5 5 10 15.0
6 2 NaN NaN
7 NaN NaN NaN
8 4 6 7.8
9 6 7 8.0
10 7 NA 5.0
11 NA NA 6.0
12 NA NA 3.0
13 NA NA NaN