为什么数据帧上的.vector没有返回TRUE?

时间:2014-05-28 19:44:43

标签: r

tl; dr - R中的矢量究竟是什么?

长版:

很多东西是R中的向量。例如,数字是长度为1的数字向量:

is.vector(1)
[1] TRUE

列表也是一个向量。

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

好的,所以列表是一个向量。显然,数据框是一个列表。

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

但是,(似乎违反了传递属性),数据帧不是矢量,即使数据帧是列表,列表也是矢量。 编辑:它是一个向量,它只有其他属性,这会导致这种行为。请参阅下面接受的答案。

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

这怎么可能?

3 个答案:

答案 0 :(得分:7)

要以另一种方式回答您的问题,the R Internals manual列出了R的八种内置矢量类型:"逻辑","数字"," character"," list"," complex"," raw"," integer"," expression"

为了测试一个对象的非属性部分是否真的是这些矢量类型中的一个"在它下面#34;,你可以检查is()的结果,如下所示:

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

答案 1 :(得分:3)

说明@joran指出的内容,is.vector在具有除名称之外的任何属性的向量上返回false(我从来不知道)......

# 1) Example of when a vector stops being a vector...
> dubious = 7:11
> attributes(dubious)
NULL
> is.vector(dubious)
[1] TRUE

#now assign some additional attributes        
> attributes(dubious) <- list(a = 1:5)
> attributes(dubious)
$a
[1] 1 2 3 4 5

> is.vector(dubious)
[1] FALSE


# 2) Example of how to strip a dataframe of attributes so it looks like a true vector ...

> df = data.frame()
> attributes(df)
$names
character(0)

$row.names
integer(0)

$class
[1] "data.frame"

> attributes(df)[['row.names']] <- NULL
> attributes(df)[['class']] <- NULL
> attributes(df)
$names
character(0)

> is.vector(df)
[1] TRUE

答案 2 :(得分:1)

不是答案,但这里有一些其他有趣的事情绝对值得研究。其中一些与对象存储在R中的方式有​​关。

一个例子:

如果我们设置一个元素的matrix,该元素是一个列表,我们得到以下内容。即使它是一个列表,它也可以存储在矩阵的一个元素中。

> x <- matrix(list(1:5)) # we already know that list is also a vector
> x
#      [,1]     
# [1,] Integer,5

现在,如果我们强制x到数据框,它的尺寸仍为(1,1)

> y <- as.data.frame(x)
> dim(y)
# [1] 1 1

现在,如果我们查看y的第一个元素,那就是数据框列,

> y[1]
#              V1
# 1 1, 2, 3, 4, 5

但是,如果我们查看y的第一列,它就是一个列表

> y[,1]
# [[1]]
# [1] 1 2 3 4 5

y的第一行完全相同。

> y[1,]
# [[1]]
# [1] 1 2 3 4 5

如果你有时间,有很多关于R对象的属性很难调查。