Создайте подсписок в списке фреймов данных с точки зрения измерения фреймов данных
У меня есть список фреймов данных, которые имеют разные размеры. Я хочу создать разные альтернативные списки, содержащие кадры данных с одинаковым количеством столбцов.
Структура моего списка 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