Создайте подсписок в списке фреймов данных с точки зрения измерения фреймов данных

У меня есть список фреймов данных, которые имеют разные размеры. Я хочу создать разные альтернативные списки, содержащие кадры данных с одинаковым количеством столбцов.

Структура моего списка df_list выглядит примерно так:

Список 6

  $ df1:'data.frame':   49743 obs. of  88 variables
  $ df2:'data.frame':   49889 obs. of  89 variables 
  $ df3:'data.frame':   50500 obs. of  91 variables
  $ df4:'data.frame':   49732 obs. of  88 variables
  $ df5:'data.frame':   48500 obs. of  90 variables 
  $ df6:'data.frame':   50011 obs. of  91 variables

Мой желаемый результат будет что-то похожее на:

sub_list1 = list(df1, df4)
sub_list2 = list(df3, df6)

Может ли кто-нибудь помочь мне решить эту проблему? Спасибо заранее

1 ответ

Решение

Это очень легко решить с помощью

split(df_list, lengths(df_list)) 
# or for older R versions: split(df_list, sapply(df_list, ncol))

что приведет к новому списку списков, и каждый из подсписков содержит data.frame с равным количеством столбцов.


Вот воспроизводимый пример:

l <- list(
  data.frame(x = 1),
  data.frame(x = 1, y = 2),
  data.frame(x = 1),
  data.frame(x = 1, y = 2, z = 3),
  data.frame(x = 1))

Чтобы проверить, сколько переменных каждый data.frame в l имеет, запустить:

lengths(l)
#[1] 1 2 1 3 1

Теперь вы можете разделить их и проверить структуру:

res <- split(l, lengths(l))
str(res)
#List of 3
# $ 1:List of 3
#  ..$ :'data.frame':   1 obs. of  1 variable:
#  .. ..$ x: num 1
#  ..$ :'data.frame':   1 obs. of  1 variable:
#  .. ..$ x: num 1
#  ..$ :'data.frame':   1 obs. of  1 variable:
#  .. ..$ x: num 1
# $ 2:List of 1
#  ..$ :'data.frame':   1 obs. of  2 variables:
#  .. ..$ x: num 1
#  .. ..$ y: num 2
# $ 3:List of 1
#  ..$ :'data.frame':   1 obs. of  3 variables:
#  .. ..$ x: num 1
#  .. ..$ y: num 2
#  .. ..$ z: num 3
Другие вопросы по тегам