Преобразовать список информационных кадров различной длины в массив - PullRequest
0 голосов
/ 08 июня 2018

В настоящее время у меня есть список из 7 фреймов данных, каждый из которых имеет 24 столбца, но не одинаковое количество строк.Я хотел бы преобразовать мой список в 3-мерный массив, но не могу, потому что все компоненты моего списка не имеют одинаковое измерение.У меня есть один dataframe с 60 строками, 4 dataframes с 59 строками и 2 с 58 строками.

Когда я пытаюсь laply(mylist, unlist), я получаю следующее сообщение: Ошибка: результаты должны иметь одинаковые измерения.

Есть ли способ поместить эти кадры данных в массив?Как я могу поставить NA в конце 6 других фреймов данных, чтобы получить их в 60 строк?

1 Ответ

0 голосов
/ 09 июня 2018

Я не уверен в реальном назначении 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...