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
答案 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对象的属性很难调查。