Я не уверен в реальном назначении OP, которое заставило его задуматься о создании массива 3-D
, для которого ему нужны все фреймы данных списка, содержащие одинаковое количество строк.
Но, какой бы ни была причина, этого можно достичь, используя lapply
.Обратите внимание, что функция lengths
не работает должным образом в списке, содержащем фреймы данных.Так как lengths
функция просто возвращает количество столбцов в каждом фрейме данных, содержащихся в списке.
Следовательно, подход заключается в том, чтобы сначала найти максимальное количество строк во фрейме данных, содержащемся в mylist
.Затем выполните итерацию по каждому фрейму данных, чтобы расширить его строки до максимального количества строк.
# Find maximum row across all data frames in mylist
maxrow <- max(sapply(mylist, nrow))
# Iterate over and increase the row count to maxrow
mylist_mod <- lapply(mylist, function(x,nRow){
if(nrow(x) < nRow){
x[(nrow(x)+1):nRow,] <- NA
}
x
}, nRow = maxrow)
mylist_mod
# $df1
# one two three
# 1 101 111 131
# 2 102 112 132
# 3 103 113 133
# 4 NA NA NA
# 5 NA NA NA
#
# $df2
# one two three
# 1 201 211 231
# 2 202 212 232
# 3 NA NA NA
# 4 NA NA NA
# 5 NA NA NA
#
# $df3
# one two three
# 1 301 311 331
# 2 302 312 332
# 3 303 313 333
# 4 304 314 334
# 5 305 315 335
Образцы данных:
df1 <- data.frame(one = 101:103, two = 111:113, three = 131:133)
df2 <- data.frame(one = 201:202, two = 211:212, three = 231:232)
df3 <- data.frame(one = 301:305, two = 311:315, three = 331:335)
mylist <- list(df1 = df1, df2 = df2, df3 = df3)
mylist
# $df1
# one two three
# 1 101 111 131
# 2 102 112 132
# 3 103 113 133
#
# $df2
# one two three
# 1 201 211 231
# 2 202 212 232
#
# $df3
# one two three
# 1 301 311 331
# 2 302 312 332
# 3 303 313 333
# 4 304 314 334
# 5 305 315 335