goofnaggle
goofnaggle

Reputation: 43

How to split a R data frame into vectors (unbind)

I'm relatively new to R and have been trying to find a solution to this problem for a while. I am trying to take a data frame and essentially do the reverse of rbind, so that I can split an entire data frame (and hopefully preserve the original data frame) into separate vectors, and use the row.names as the source of the new variable names.

So if I have a data.frame like this:

      Col1  Col2 Col3
Row1   A     B    C
Row2   D     E    F
Row3   G     H    I

I would like the end result to be separate vectors:

Row1 = A B C
Row2 = D E F
Row3 = G H I

I know I could subset specific rows out of the data.frame, but I want all of them separated. In terms of methodology could I use a for loop to move each row into a vector, but I wasn't exactly sure how to assign row names as variable names.

Upvotes: 4

Views: 6276

Answers (2)

nrussell
nrussell

Reputation: 18612

A slightly different approach than @akrun's:

Df <- data.frame(matrix(LETTERS[1:9],nrow=3))
##
R> ls()
[1] "Df"
##
sapply(1:nrow(Df), function(x){
  assign(paste0("Row",row.names(Df)[x]),
         value=Reduce(function(x,y){c(x,y)},Df[x,]),
         envir=.GlobalEnv)
})
##
R> ls()
[1] "Df"   "Row1" "Row2" "Row3"
R> Row1
[1] "A" "D" "G"
R> Row2
[1] "B" "E" "H"
R> Row3
[1] "C" "F" "I"

Upvotes: 1

akrun
akrun

Reputation: 887911

You can split the dataset by row after converting to matrix, set the names (setNames) of the list elements as 'Row1:Row3' and use list2env to assign the objects in the global environment.

 list2env(setNames(split(as.matrix(df),
        row(df)), paste0("Row",1:3)), envir=.GlobalEnv)

 Row1
 #[1] "A" "B" "C"
 Row2
 #[1] "D" "E" "F"

Upvotes: 4

Related Questions