У меня есть data.frame, который я хотел бы преобразовать в список по строкам, то есть каждая строка будет соответствовать своим собственным элементам списка. Другими словами, мне нужен список, который будет содержать строки в data.frame.
До сих пор я решал эту проблему следующим образом, но мне было интересно, есть ли лучший способ подойти к этому.
xy.df <- data.frame(x = runif(10), y = runif(10))
# pre-allocate a list and fill it with a loop
xy.list <- vector("list", nrow(xy.df))
for (i in 1:nrow(xy.df)) {
xy.list[[i]] <- xy.df[i,]
}
split
каждого элементаdata.frame with 1 rows and N columns
вместоlist of length N
split
вам, вероятно, следует поступитьdrop=T
иначе, ваши исходные уровни факторов не упадутЭврика!
источник
unlist(apply(xy.df, 1, list), recursive = FALSE)
, Однако решение Флоделя более эффективно, чем использованиеapply
илиt
.t
преобразуетdata.fame
вmatrix
так, чтобы элементы в списке являются атомными векторами, а не список , как просили ОП. Обычно это не проблема, пока у вас не будутxy.df
смешанные типы ...apply
. На самом деле это просто цикл for, реализованный в R. Онlapply
выполняет цикл в C, что значительно быстрее. Этот формат списка строк на самом деле предпочтительнее, если вы делаете много циклов.apply
версия.mapply(data.frame, xy.df, NULL)
Если вы хотите полностью злоупотребить data.frame (как это делаю я) и хотите сохранить функциональность $, один из способов - разбить data.frame на однострочные data.frames, собранные в список:
Это не только интеллектуальная мастурбация, но и позволяет «преобразовать» data.frame в список его строк, сохраняя $ indexation, что может быть полезно для дальнейшего использования с lapply (при условии, что функция, которую вы передаете lapply, использует эту $ indexation)
источник
data.frame
s в единыйdata.frame
?Более современное решение использует только
purrr::transpose
:источник
Я работал над этим сегодня для data.frame (на самом деле data.table) с миллионами наблюдений и 35 столбцами. Моя цель состояла в том, чтобы вернуть список data.frames (data.tables), каждый с одной строкой. То есть я хотел разделить каждую строку на отдельный data.frame и сохранить их в списке.
Вот два метода, которые я придумал, которые были примерно в 3 раза быстрее, чем
split(dat, seq_len(nrow(dat)))
для этого набора данных. Ниже я сравниваю эти три метода с набором данных из 7500 строк и 5 столбцов ( диафрагма повторяется 50 раз).Это возвращает
Хотя различия не так велики, как в моем предыдущем тесте, прямой
setDF
метод значительно быстрее на всех уровнях распределения прогонов с max (setDF) <min (split), аattr
метод обычно более чем в два раза быстрее.Четвертый метод - это крайний чемпион, который представляет собой простой вложенный
lapply
, возвращающий вложенный список. Этот метод иллюстрирует стоимость создания data.frame из списка. Более того, все методы, которые я пробовал с этойdata.frame
функцией, были примерно на порядок медленнее, чемdata.table
методы.данные
источник
Кажется, текущая версия пакета
purrr
(0.2.2) - самое быстрое решение:Сравним самые интересные решения:
Rsults:
Также мы можем получить тот же результат с
Rcpp
:Теперь сравните с
purrr
:Полученные результаты:
источник
by_row()
перемещен вlibrary(purrrlyr)
Еще пара вариантов:
С участием
asplit
С
split
иrow
данные
источник
Лучшим способом для меня было:
Пример данных:
Мы называем
BBmisc
библиотекуИ результат будет:
источник
Альтернативный способ - преобразовать df в матрицу, а затем применить к ней
lappy
функцию list apply :ldf <- lapply(as.matrix(myDF), function(x)x)
источник
Другой вариант использования
library(purrr)
(который, кажется, немного быстрее на больших data.frames)источник
Как писал @flodel: Это преобразует ваш фрейм данных в список, который имеет то же количество элементов, что и количество строк в фрейме данных:
Вы можете дополнительно добавить функцию для выбора только тех столбцов, которые не являются NA в каждом элементе списка:
источник
by_row
Функция изpurrrlyr
пакета будет делать это для вас.Этот пример демонстрирует
По умолчанию возвращаемое значение из
myfn
помещается в новый столбец списка в вызываемой df.out
. В$.out
конце приведенного выше оператора немедленно выбирается этот столбец, возвращая список списков.источник