Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is.vector on a data-frame doesn't return TRUE?

Tags:

r

tl;dr - What the hell is a vector in R?

Long version:

Lots of stuff is a vector in R. For instance, a number is a numeric vector of length 1:

is.vector(1)
[1] TRUE

A list is also a vector.

is.vector(list(1))
[1] TRUE

OK, so a list is a vector. And a data frame is a list, apparently.

is.list(data.frame(x=1))
[1] TRUE

But, (seemingly violating the transitive property), a data frame is not a vector, even though a dataframe is a list, and a list is a vector. EDIT: It is a vector, it just has additional attributes, which leads to this behavior. See accepted answer below.

is.vector(data.frame(x=1))
[1] FALSE

How can this be?

like image 964
Andrew Barr Avatar asked May 28 '14 19:05

Andrew Barr


People also ask

What is a vector in a Dataframe?

A vector, in R, is a list of data items. A vector can contain numbers, character strings, or logical values but not a mixture. All of the data items in a vector must be the same type.

What is the difference between a Dataframe and a vector?

A data frame is a collection of vectors of identical lengths. Each vector represents a column, and each vector can be of a different data type (e.g., characters, integers, factors). The str() function is useful to inspect the data types of the columns.

Is a vector a data frame?

A vector will create a one-column data frame. A list will create one column for each element; it's an error if they're not all the same length. A matrix will create a data frame with the same number of columns and rows as the matrix.

How do I convert a data frame to a vector in R?

For the Conversion of dataframe into a vector, we can simply pass the dataframe column name as [[index]]. Approach: We are taking a column in the dataframe and passing it into another variable by the selection method. Selection method can be defined as choosing a column from a data frame using ” [[]]”.


1 Answers

To answer your question another way, the R Internals manual lists R's eight built-in vector types: "logical", "numeric", "character", "list", "complex", "raw", "integer", and "expression".

To test whether the non-attribute part of an object is really one of those vector types "underneath it all", you can examine the results of is(), like this:

isVector <- function(X) "vector" %in% is(X)

df <- data.frame(a=1:4)
isVector(df)
# [1] TRUE

# Use isVector() to examine a number of other vector and non-vector objects    
la  <- structure(list(1:4), mycomment="nothing")
chr <- "word"                  ## STRSXP
lst <- list(1:4)               ## VECSXP
exp <- expression(rnorm(99))   ## EXPRSXP
rw  <- raw(44)                 ## RAWSXP
nm  <- as.name("x")            ## LANGSXP
pl  <- pairlist(b=5:8)         ## LISTSXP

sapply(list(df, la, chr, lst, exp, rw, nm, pl), isVector)
# [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
like image 196
Josh O'Brien Avatar answered Oct 12 '22 07:10

Josh O'Brien