В этом вопросе многое происходит, и некоторые из них, я думаю, могут сбить с толку новичков в R, особенно если вы попали в R из статистического пакета другого типа или из электронной таблицы.Также некоторые из них на первый взгляд будут выглядеть непоследовательными, но в конечном итоге станут казаться естественными.
Часть этой проблемы заключается в том, что ваша проблема с памятью маскирует еще одну проблему, а именно то, как вы выполняете поднаборы.Скорее всего, исправление проблемы подмножества решит проблему с памятью.
Подмножество фрейма данных в R может фокусироваться на строке, столбцах или обоих.Вы можете выбрать целые столбцы или целые строки, либо строки, либо столбцы на основе логических операторов (которые могут оцениваться как TRUE или FALSE).В вашем случае вы хотите выбрать целые столбцы с конкретными именами.Поэтому вы хотите дать только конкретные имена.Есть два способа сделать это, которые дают одинаковый результат.
identical(iris[c("Sepal.Length","Petal.Length")],
iris[,c("Sepal.Length","Petal.Length")])
Обратите внимание на тонкую разницу между ними.Первый просто дает имена столбцов, которые вы хотите в векторе.Это использует тот факт, что фрейм данных также является списком (столбцов), и вы можете создавать подмножества списков, используя имена элементов списка, в данном случае имена столбцов.Второй использует тот факт, что фрейм данных работает как матрица (та, которая может иметь разные типы данных, что делает ее не матрицей в R).Будучи похожим на матрицу, вы можете ссылаться на его части через строки и столбцы, строки и столбцы, разделенные запятой.Это означает, что если вам нужно несколько строк или столбцов, вам нужно предоставить их как вектор, созданный с помощью c()
.
Однако важно отметить, что способ обращения к столбцам (с пометкой $
) не является правильным способом сделать это.Фактически, это ссылка на весь столбец данных в виде вектора (или в тидивсе как на столбец с одним столбцом).Другими словами, если iris$Petal.Length
, это не просто говорит: «Получите мне столбец с этим именем», это фактически говорит: «Получите мне все столбцы, имена которых соответствуют значениям в столбце Petal.Length радужной оболочки».
В вашем исходном коде это еще более усложняется, поскольку в нем говорится, что мне нужно получить все строки с именами строк, которые имеют значения в столбце «Бренд», что вызовет всевозможные проблемы, учитывая, что Бренд, вероятно,не содержит уникальных значений, а имена строк должны быть уникальными.
Для обучения я рекомендую вам попробовать все эти варианты (и более) с небольшим набором данных, таким как радужная оболочка, чтобы вы могли видеть огромное разнообразие возможных сообщений об ошибках.это может произойти до того, как у вас закончится память.
Добавление:
Просто, чтобы добавить немного больше к этому ... вы, возможно, использовали нотацию $
, потому что вы видели или использовали ее раньше в контексте поднабора, но этообычно в контексте поднабора с использованием логических операторов.Например,
iris[iris$Sepal.Length > 5,]
подставляет в подмножество те строки , у которых значения Sepal.Length больше 5. Это делается путем создания отдельного логического вектора с тем же числом строк, что и радужная оболочка, и вэто значение TRUE для тех строк, где Sepal.Length> 5 и false для других строк.Тогда сохраняются только те строки, которые соответствуют ИСТИННЫМ строкам в другом векторе.Это эквивалентно.
x <- iris$Sepal.Length > 5
iris[x,]
Чтобы использовать ту же идею логического выражения для столбцов, вам нужен логический вектор той же длины, что и вектор имени столбца, который вы хотите сохранить.Так, например, colnames () дает нам вектор имен столбцов, а затем x <- c ("Species", "Sepal.Length") colnames (iris)% в% x дает нам логический вектор </p>
[1] TRUE FALSE FALSE FALSE TRUE
поэтому
iris[, colname(iris) %in% x]
даст нам фрейм данных только с двумя столбцами, где утверждение верно.Это кажется сложным, пока вы не захотите создать функцию, которая принимает произвольный список имен столбцов для подмножества.