Today I ran into a double question that might be relevant to other R users:
Why can’t I assign a dataframe row into a matrix row?
And why won’t my function accept this dataframe row as an input argument?
A single row of a dataframe is a one-row dataframe, i.e. a list, not a vector. R won’t automatically treat dataframe rows as vectors, because a dataframe’s columns can be of different types. So converting them to a vector (which must be all of a single type) would be tricky to generalize.
But if in your case you know all your columns are numeric (no characters, factors, etc), you can convert it to a numeric matrix yourself, using the as.matrix()
function, and then treat its rows as vectors.
> # Create a simple dataframe > # and an empty matrix of the same size > my.df <- data.frame(x=1:2, y=3:4) > my.df x y 1 1 3 2 2 4 > dim(my.df) [1] 2 2 > my.matrix <- matrix(0, nrow=2, ncol=2) > my.matrix [,1] [,2] [1,] 0 0 [2,] 0 0 > dim(my.matrix) [1] 2 2 > > # Try assigning a row of my.df into a row of my.matrix > my.matrix[1,] <- my.df[1,] > my.matrix [[1]] [1] 1 [[2]] [1] 0 [[3]] [1] 3 [[4]] [1] 0 > dim(my.matrix) NULL > # my.matrix became a list! > > # Convert my.df to a matrix first > # before assigning its rows into my.matrix > my.matrix <- matrix(0, nrow=2, ncol=2) > my.matrix[1,] <- as.matrix(my.df)[1,] > my.matrix [,1] [,2] [1,] 1 3 [2,] 0 0 > dim(my.matrix) [1] 2 2 > # Now it works. > > # Try using a row of my.df as input argument > # into a function that requires a vector, > # for example stem-and-leaf-plot: > stem(my.df[1,]) Error in stem(my.df[1, ]) : 'x' must be numeric > # Fails because my.df[1,] is a list, not a vector. > # Convert to matrix before taking the row: > stem(as.matrix(my.df)[1,]) The decimal point is at the | 1 | 0 1 | 2 | 2 | 3 | 0 > # Now it works.
For clarifying dataframes vs matrices vs arrays, I found this link quite useful:
http://faculty.nps.edu/sebuttre/home/R/matrices.html#DataFrames