У меня есть датафрейм, такой как:
a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)
Я попробовал следующее, чтобы преобразовать один из столбцов в вектор, но это не работает:
avector <- as.vector(aframe['a2'])
class(avector)
[1] "data.frame"
Это единственное решение, которое я мог бы придумать, но я предполагаю, что должен быть лучший способ сделать это:
class(aframe['a2'])
[1] "data.frame"
avector = c()
for(atmp in aframe['a2']) { avector <- atmp }
class(avector)
[1] "numeric"
Примечание: мой словарь выше может быть отключен, поэтому, пожалуйста, исправьте меня, если так. Я все еще изучаю мир R. Кроме того, приветствуется любое объяснение того, что здесь происходит (то есть отношение к Python или другому языку поможет!)
r
dataframe
vector
type-conversion
Долан Антенуччи
источник
источник
?'[.data.frame'
приведет вас очень далеко.Ответы:
Я попытаюсь объяснить это, не делая ошибок, но я держу пари, что это привлечет одно или два уточнения в комментариях.
Фрейм данных - это список. Когда вы поднастраиваете фрейм данных, используя имя столбца и
[
, то, что вы получаете, это подсписок (или фрейм данных). Если вам нужен фактический атомарный столбец, вы можете использовать[[
, или несколько запутанно (для меня), вы можете сделать,aframe[,2]
который возвращает вектор, а не подсписок.Так что попробуйте запустить эту последовательность, и, возможно, все будет яснее:
источник
aframe[,"a2"]
из-за возможности использовать это как с фреймами данных, так и с матрицами и, похоже, получаю одинаковые результаты - вектор.[..., drop = F]
всегда будет возвращать фрейм данныхdf$x
синтаксис возвращает вектор. Я использовал этот синтаксис в течение длительного времени, но когда мне пришлось начать использоватьdf['name']
илиdf[n]
извлекать столбцы, у меня возникали проблемы, когда я пытался отправить их функциям, которые ожидали векторов. Использованиеdf[[n]]
илиdf[['x']]
очистить вещи прямо вверх.as.vector
кажется, что молча ничего не дает ? Не должно ли это либо вернуть вектор, либо явно потерпеть неудачу?aframe[['a2']]
очень полезно сsf
объектами, потомуaframe[,"a2"]
что вернет два столбца, потому что столбец геометрии включен.Теперь есть простой способ сделать это, используя
dplyr
.источник
Вы можете использовать
$
извлечение:или двойная квадратная скобка:
источник
Вам не нужно
as.vector()
, но вам нужна правильная индексация:avector <- aframe[ , "a2"]
Еще одна вещь, о которой нужно знать, это
drop=FALSE
возможность[
:источник
drop=FALSE
полезно - это помогает мне в тех случаях, когда я могу выбрать N столбцов из data.frame, в тех случаях, когда N = 1.Другое преимущество использования оператора [[[] заключается в том, что он работает как с data.frame, так и с data.table. Таким образом, если функция должна быть запущена как для data.frame, так и для data.table, и вы хотите извлечь из нее столбец как вектор, тогда
лучший.
источник
Вы можете попробовать что-то вроде этого
источник
identical
.Если вы просто используете оператор извлечения, он будет работать. По умолчанию [] устанавливает опцию
drop=TRUE
, которая вам здесь нужна. Смотрите?'['
для более подробной информации.источник
источник
источник
Я использую списки для фильтрации информационных фреймов по тому, имеют ли они значение% в% списка.
Я вручную создавал списки, экспортируя 1-столбцовый фрейм данных в Excel, где я добавил бы «» вокруг каждого элемента, прежде чем вставлять в R: list <- c («el1», «el2», ...), который обычно был затем следует FilteredData <- subset (Данные, Столбец% в списке%).
После поиска в stackoverflow и не найдя интуитивно понятного способа преобразования 1-столбцового кадра данных в список, я публикую свой первый в истории вклад в stackoverflow:
источник
Мы также можем преобразовать столбцы data.frame в общий вектор.
as.vector
этого недостаточно, поскольку он сохраняет класс и структуру data.frame, поэтому мы также должны извлечь первый (и единственный) элемент:Все предложенные решения требуют жесткого заголовка столбцов. Это делает их не универсальными (представьте, что вы примените это к аргументам функции).
В качестве альтернативы вы можете, конечно, сначала прочитать имена столбцов из столбца, а затем вставить их в код других решений.
источник