2010-03-30 2 views
40

У меня есть dataframe с цифровыми записями как этотПреобразование dataframe к вектору (по строкам)

test <- data.frame(x=c(26,21,20),y=c(34,29,28)) 

Как я могу получить следующий вектор?

> 26,34,21,29,20,28 

Я был в состоянии получить его, используя следующий, но я думаю, там должна быть гораздо более элегантным способом

X <- test[1,] 
for (i in 2:dim(test)[1]){ 
X <- cbind(X,test[i,]) 
} 

ответ

91

Вы можете попробовать as.vector(t(test)). Обратите внимание, что если вы хотите сделать это по столбцам, вы должны использовать unlist(test).

+24

'c (t (test))' работает тоже. – Marek

+0

Я не могу понять об этом обходном пути. может дать еще несколько объяснений? @teucer – verystrongjoe

+2

@verystrongjoe здесь две вещи: 1) t неявно преобразует data.frame в матрицу, 2) матрица - это просто специальный вектор с атрибутом dim, а as.vector или c удаляет его – teucer

7
c(df$x, df$y) 
# returns: 26 21 20 34 29 28 

если конкретный порядок важен, то:

M = as.matrix(df) 
c(m[1,], c[2,], c[3,]) 
# returns 26 34 21 29 20 28 

Или, в общем случае:

m = as.matrix(df) 
q = c() 
for (i in seq(1:nrow(m))){ 
    q = c(q, m[i,]) 
} 

# returns 26 34 21 29 20 28 
+0

Да, порядок имеет значение, я хочу конвертировать по строкам. И строк намного больше 3. Поэтому было бы лучше, если бы вы могли преобразовать это в цикл или использовать векторизованную функцию. Спасибо. – Brani

+0

тривиальный шаг; отредактированный ответ соответственно. – doug

Смежные вопросы