Как составить список фреймов данных и как получить доступ к каждому из этих фреймов данных из списка?
Например, как я могу поместить эти фреймы данных в список?
d1 <- data.frame(y1 = c(1, 2, 3),
y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1),
y2 = c(6, 5, 4))
=
не<-
внутриdata.frame()
. При использовании<-
вы создаетеy1
иy2
в вашей глобальной среде, и ваш фрейм данных не то, что вы хотите, чтобы это было.<-
внутри data.frame (). Каким я был новичком.Ответы:
Это не связано с вашим вопросом, но вы хотите использовать,
=
а не<-
в вызове функции. Если вы используете<-
, вы в конечном итоге создадите переменныеy1
иy2
в любой среде, в которой вы работаете:Это не будет иметь желаемого эффекта от создания имен столбцов во фрейме данных:
=
Оператор, с другой стороны, будет связывать свои векторы с аргументамиdata.frame
.Что касается вашего вопроса, составить список фреймов данных очень просто:
Вы получаете доступ к фреймам данных так же, как и к любому другому элементу списка:
источник
Другие ответы показать вам , как сделать список data.frames , когда вы уже имеете кучу data.frames, например,
d1
,d2
, .... Имея последовательно именованные кадры данных является проблемой, и поместив их в список является Хорошее решение, но лучше всего избегать того, чтобы куча data.frames отсутствовала в списке .Другие ответы дают много подробностей о том, как назначить фреймы данных элементам списка, получить к ним доступ и т. Д. Мы также рассмотрим это немного здесь, но главное - сказать , не ждите, пока у вас не появится куча
data.frames
добавить их в список. Начните со списка.В оставшейся части этого ответа будут рассмотрены некоторые распространенные случаи, когда у вас может возникнуть желание создать последовательные переменные, и будет показано, как переходить прямо к спискам. Если вы новичок в списках в R, вы можете также прочитать В чем разница между доступом к элементам списка
[[
и[
доступом к ним? ,Списки с самого начала
Никогда не создавай
d1
d2
d3
...dn
во-первых. Создайте списокd
сn
элементами.Чтение нескольких файлов в список фреймов данных
Это делается довольно легко при чтении в файлах. Может быть, у вас есть файлы
data1.csv, data2.csv, ...
в каталоге. Ваша цель - список вызываемых data.framesmydata
. Первое, что вам нужно, это вектор со всеми именами файлов. Вы можете построить это с пастой (например,my_files = paste0("data", 1:5, ".csv")
), но это, вероятно , проще в использовании ,list.files
чтобы захватить все соответствующие файлы:my_files <- list.files(pattern = "\\.csv$")
. Вы можете использовать регулярные выражения для сопоставления файлов, узнайте больше о регулярных выражениях в других вопросах, если вам нужна помощь там. Таким образом, вы можете получить все файлы CSV, даже если они не следуют хорошей схеме именования. Или вы можете использовать более необычный шаблон регулярных выражений, если вам нужно выбрать определенные CSV-файлы из нескольких.На этом этапе большинство начинающих R будут использовать
for
цикл, и в этом нет ничего плохого, он работает просто отлично.Более R-подобный способ сделать это с
lapply
помощью ярлыка для вышеКонечно, замените другую функцию импорта данных на
read.csv
соответствующую.readr::read_csv
илиdata.table::fread
будет быстрее, или вам может потребоваться другая функция для файла другого типа.В любом случае, удобно именовать элементы списка в соответствии с файлами
Разделение фрейма данных на список фреймов данных
Это очень просто, базовая функция
split()
делает это за вас. Вы можете разделить на столбец (или столбцы) данных, или на что угодноЭто также хороший способ разбить фрейм данных на части для перекрестной проверки. Может быть, вы хотите разделить
mtcars
на части обучения, тестирования и проверки.Имитация списка фреймов данных
Может быть, вы имитируете данные, что-то вроде этого:
Но кто делает только одну симуляцию? Вы хотите сделать это 100 раз, 1000 раз, больше! Но вам не нужно 10 000 фреймов данных в вашем рабочем пространстве. Используйте
replicate
и поместите их в список:Особенно в этом случае вам следует также подумать, действительно ли вам нужны отдельные фреймы данных, или же сработал бы один фрейм данных со столбцом «группа»? Использование
data.table
илиdplyr
это довольно легко сделать "по группам" с фреймом данных.Я не поместил свои данные в список :( Я сделаю это в следующий раз, но что мне теперь делать?
Если это нечетный ассортимент (что необычно), вы можете просто назначить их:
Если у вас есть кадры данных с именем в виде рисунка, например,
df1
,df2
,df3
и вы хотите их в списке, вы можетеget
их , если вы можете написать регулярное выражение для имен. Что-то вродеОбычно
mget
используется для получения нескольких объектов и возврата их в именованный список. Его аналогget
используется для получения одного объекта и его возврата (не в списке).Объединение списка фреймов данных в один фрейм данных
Обычной задачей является объединение списка фреймов данных в один большой фрейм данных. Если вы хотите разместить их друг над другом, вы должны использовать
rbind
их пару, но для списка фреймов данных есть три хороших варианта:(Аналогично, используя
cbind
илиdplyr::bind_cols
для столбцов.)Чтобы объединить (объединить) список фреймов данных, вы можете увидеть эти ответы . Часто, идея заключается в том , чтобы использовать
Reduce
сmerge
(или какой - либо другой функцией соединения) , чтобы получить их вместе.Зачем помещать данные в список?
Помещенный аналогичные данные в списках , потому что вы хотите делать подобные вещи для каждого кадра данных, а также функции , такие как
lapply
,sapply
do.call
, пакет , и старые функции позволяют легко сделать это. Примеры людей, легко делающих вещи со списками, повсюду.purrr
plyr
l*ply
Даже если вы используете простой цикл for, гораздо проще зацикливать элементы списка, чем создавать имена переменных с помощью
paste
и обращаться к объектам с помощьюget
. Проще отлаживать тоже.Подумайте о масштабируемости . Если вам действительно нужно только три переменные, это хорошо для использования
d1
,d2
,d3
. Но тогда, если окажется, что вам действительно нужно 6, это намного больше печатать. И в следующий раз, когда вам понадобится 10 или 20, вы обнаружите, что копируете и вставляете строки кода, возможно, используете find / replace для переходаd14
наd15
, и вы думаете, что программирование не должно быть таким . Если вы используете список, разница между 3 случаями, 30 случаями и 300 случаями составляет не более одной строки кода - без изменений, если количество случаев автоматически определяется, например, по количеству.csv
файлов в вашем каталог.Вы можете назвать элементы списка, если вы хотите использовать что-то кроме числовых индексов для доступа к вашим фреймам данных (и вы можете использовать оба, это не выбор XOR).
В целом, использование списков приведет к написанию более чистого и удобного для чтения кода, что приведет к уменьшению количества ошибок и путанице.
источник
r
иlist
.my_data <- NULL
вместо my_data <- list () '! :)my_data <- list()
дает понять, что вы создаете список, и это хорошо! Чистый код это хорошая вещь. Я не вижу никакого преимущества в использованииmy_data <- NULL
вместо этого.names(my_data) <- gsub("\\.csv$", "", my_files)
;) <br> Но я действительно уважаю ваши советы, поскольку я многому у них учусь, как новичку, и я действительно ценю это :)Вы также можете получить доступ к определенным столбцам и значениям в каждом элементе списка с помощью
[
и[[
. Вот пара примеров. Во-первых, мы можем получить доступ только к первому столбцу каждого фрейма данных в спискеlapply(ldf, "[", 1)
, где1
обозначает номер столбца.Точно так же мы можем получить доступ к первому значению во втором столбце с помощью
Тогда мы также можем получить доступ к значениям столбца напрямую, как вектор, с
[[
источник
Если у вас есть большое количество последовательно именованных фреймов данных, вы можете создать список нужного подмножества фреймов данных, например:
где
my.list2
возвращает список, содержащий 2-й, 3-й и 4-й кадры данных.Однако обратите внимание, что кадры данных в приведенном выше списке больше не называются. Если вы хотите создать список, содержащий подмножество фреймов данных и хотите сохранить их имена, вы можете попробовать это:
который возвращает:
источник
lapply(foo, get)
просто используйтеmget(foo)
Принимая как данность, у вас есть «большое» число data.frames с похожими именами (здесь d #, где # - некоторое положительное целое число), следующее - небольшое улучшение метода @ mark-miller. Это более кратко и возвращает именованный список data.frames, где каждое имя в списке является именем соответствующего исходного data.frame.
Ключ используется
mget
вместе сls
. Если фреймы данных d1 и d2, представленные в вопросе, были единственными объектами с именами d # в среде, токоторый бы вернулся
В этом методе используется аргумент pattern
ls
, который позволяет нам использовать регулярные выражения для более точного анализа имен объектов в среде. Альтернативой регулярному выражению"^d[0-9]+$"
является"^d\\d+$"
.Как указывает @gregor , в целом лучше настроить процесс построения данных, чтобы в начале они помещались в именованные списки.
данные
источник
Это может быть немного поздно, но возвращаясь к вашему примеру, я подумал, что я бы немного расширил ответ.
Тогда вы легко составите свой список:
Теперь у вас есть список, но вместо доступа к списку старый способ, такой как
Вы можете использовать эту функцию, чтобы получить и назначить данные по вашему выбору.
Теперь получите тот, который вы хотите.
Надеюсь, что дополнительный бит поможет.
Ура!
источник
GETDF_FROMLIST(mylist, 1)
чтобыmylist[[1]]
? Если вы предпочитаете синтаксис функции, вы можете обойтись"[["(mylist, 1)
без определения пользовательской функции.return(DF_LIST[[ITEM_LOC]])
, нет необходимости назначать промежуточную переменную.Очень просто ! Вот мое предложение:
Если вы хотите выбрать кадры данных в своем рабочем пространстве, попробуйте это:
или
все это даст тот же результат.
Вы можете изменить,
is.data.frame
чтобы проверить другие типы переменных, таких какis.function
источник
Я считаю себя полным новичком, но я думаю, что у меня есть чрезвычайно простой ответ на один из первоначальных подвопросов, который здесь не был сформулирован: доступ к фреймам данных или их частям.
Начнем с создания списка с фреймами данных, как было указано выше:
Затем, если вы хотите получить доступ к определенному значению в одном из фреймов данных, вы можете сделать это, используя двойные скобки последовательно. Первый набор возвращает вас во фрейм данных, а второй набор возвращает вас к определенным координатам:
источник