2013-04-09 2 views
54

В чем разница между dataframe и в R? Какой из них следует использовать, когда? Что проще перебрать?В чем разница между кадром данных и списком в R?

Точная проблема: Я должен сначала хранить 3 строковых элемента типа «a», «b», «c». Позже для каждого из них мне нужно добавить еще 3 элемента; например, для «a» я должен добавить «a1», «a2», «a3». Позже я должен использовать вложенные для циклов для доступа к этим элементам.

Так что я смущен, чтобы использовать dataframe или список или какой-либо другой тип данных, в котором я мог бы сначала сохранить и затем добавить (вид каждого столбца)?

В настоящее время я получаю сообщение об ошибке, как «количество элементов для замены не кратна длине замены»

+0

Я думаю, что это может помочь вам .. http://www.r-tutor.com/r- введение/data-frame и http://www.r-tutor.com/r-introduction/list – Futuregeek

+0

Неужели это был плохой вопрос? Я новичок в R и из java и C#, этот скриптовый язык казался сложным ... :( – ShazSimple

+1

@ShazSimple Сам вопрос не так уж плох. Это просто слишком общий характер. Если вы хотите, чтобы решение вашей конкретной проблемы , вам придется представить нам минимальный воспроизводимый пример, как описано [здесь] (http: // stackoverflow.ком/вопросы/5963269/как в изготовлении, а-пре-р-воспроизводимый-пример). Для этого задайте новый вопрос. Мы можем оставить это здесь как ссылку. –

ответ

95

Вопрос не так глуп, как некоторые люди думают, что это. Я знаю много людей, борющихся с этой разницей, и что использовать где. Подводя итог:

Списки на сегодняшний день являются наиболее гибкой структурой данных в R. Их можно рассматривать как совокупность элементов без каких-либо ограничений на класс, длину или структуру каждого элемента. Единственное, что вам нужно позаботиться, это то, что вы не даете двум элементам одинаковое имя. Это может вызвать много путаницы, и R не дает ошибки в том, что:

> X <- list(a=1,b=2,a=3) 
> X$a 
[1] 1 

кадров данных являются списками, а также, но у них есть несколько ограничений:

  • вы не можете использовать одно и то же имя для двух разных переменных
  • все элементы кадра данных являются векторами
  • все элементы кадра данных имеют одинаковую длину.

Из-за этих ограничений и в результате двумерной структуры, кадры данных могут Митника некоторые из поведения матриц. Вы можете выбирать строки и выполнять операции над строками. Вы не можете сделать это со списками, так как строка там не определена.

Все это подразумевает, что вы должны использовать фрейм данных для любого набора данных, который вписывается в эту двухмерную структуру. По сути, вы используете кадры данных для любого набора данных, где столбец совпадает с переменной, а строка совпадает с одним наблюдением в широком смысле слова. Для всех других структур списки - это путь.

Обратите внимание, что если вы хотите вложенную структуру, вам нужно использовать списки. Поскольку элементы списка могут быть самими списками, вы можете создавать очень гибкие структурированные объекты.

+1

Следующий вопрос: у меня есть три огромных кадра данных, и я должен выполнить на них ряд однородных функций. Должен ли я помещать их в список и «лапать», или я должен держать их отдельно? Какой из них будет меньше утерян в моей памяти и с меньшей вероятностью освободит мой компьютер? – vagabond

+1

@vagabond Я должен проверить это, но я бы заподозрил, что шея бутылки будет созданием измененного списка лапкой. Вы можете проверить себя с помощью Rprofmem и tracemem, если хотите. –

0

Посмотрите на пример: Если вы используете применять вместо sapply, чтобы получить класс -

apply(iris,2,class) # function elements are rows or columns 
Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
"character" "character" "character" "character" "character" 

sapply(iris,class) # function elements are variables 
Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
"numeric" "numeric" "numeric" "numeric"  "factor" 
Смежные вопросы