Преобразовать столбец data.frame в вектор?
У меня есть dataframe, например:
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"
Примечание: Мой словарь выше может быть выключен, поэтому, пожалуйста, поправьте меня, если да. Я все еще изучаю мир Р. Кроме того, любое объяснение того, что происходит здесь, оценено (например, в отношении Python или какого-то другого языка, помогло бы!)
Ответы
Ответ 1
Я попытаюсь объяснить это, не допуская ошибок, но я уверен, что это привлечет пояснения или два в комментариях.
Кадр данных представляет собой список. Когда вы подмножите кадр данных с использованием имени столбца и [
, то, что вы получаете, является подсписком (или фреймом подчиненных данных). Если вам нужен фактический атомный столбец, вы можете использовать [[
или несколько смутно (для меня), вы могли бы сделать aframe[,2]
, который возвращает вектор, а не подсписку.
Итак, попробуйте запустить эту последовательность, и, возможно, все будет понятнее:
avector <- as.vector(aframe['a2'])
class(avector)
avector <- aframe[['a2']]
class(avector)
avector <- aframe[,2]
class(avector)
Ответ 2
Вы можете использовать извлечение $
:
class(aframe$a1)
[1] "numeric"
или двойной квадратной скобки:
class(aframe[["a1"]])
[1] "numeric"
Ответ 3
Теперь есть простой способ сделать это с помощью dplyr
.
dplyr::pull(aframe, a2)
Ответ 4
Вам не нужно as.vector()
, но вам нужна правильная индексация: avector <- aframe[ , "a2"]
Еще одна вещь, о которой нужно знать, - это опция drop=FALSE
для [
:
R> aframe <- data.frame(a1=c1:5, a2=6:10, a3=11:15)
R> aframe
a1 a2 a3
1 1 6 11
2 2 7 12
3 3 8 13
4 4 9 14
5 5 10 15
R> avector <- aframe[, "a2"]
R> avector
[1] 6 7 8 9 10
R> avector <- aframe[, "a2", drop=FALSE]
R> avector
a2
1 6
2 7
3 8
4 9
5 10
R>
Ответ 5
Другим преимуществом использования оператора [['является то, что он работает как с data.frame, так и с data.table. Поэтому, если функция должна быть запущена как для data.frame, так и для data.table, и вы хотите извлечь из нее столбец в качестве вектора, тогда
data[["column_name"]]
лучше.
Ответ 6
Вы можете попробовать что-то вроде this-
as.vector(unlist(aframe$a2))
Ответ 7
Если вы просто используете оператор extract, он будет работать. По умолчанию [] устанавливает опцию drop=TRUE
, которую вы хотите здесь. Подробнее см. ?'['
.
> 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)
> aframe[,'a2']
[1] 6 7 8 9 10
> class(aframe[,'a2'])
[1] "numeric"
Ответ 8
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'])
avector<-unlist(avector)
#this will return a vector of type "integer"
Ответ 9
Я использую списки для фильтрации информационных фреймов по тому, имеют ли они значение% в% списка.
Я вручную создавал списки, экспортируя 1-столбцовый фрейм данных в Excel, где я добавил бы "" вокруг каждого элемента, прежде чем вставлять в R: List<- c ("el1", "el2",...), который обычно был затем следует FilteredData <- subset (Данные, Столбец% в списке%).
После поиска в stackoverflow и не найдя интуитивно понятного способа преобразования 1-столбцового фрейма данных в список, я сейчас публикую свой первый вклад в stackoverflow:
# assuming you have a 1 column dataframe called "df"
list <- c()
for(i in 1:nrow(df)){
list <- append(list, df[i,1])
}
View(list)
# This list is not a dataframe, it is a list of values
# You can filter a dataframe using "subset([Data], [Column] %in% list")
Ответ 10
as.vector(unlist(aframe['a2']))