【问题标题】:How to get the container type of an object in R?如何在R中获取对象的容器类型?
【发布时间】:2012-07-24 03:31:27
【问题描述】:

假设我有一个名为 v 的对象,我如何找出它的容器类型(向量、列表、矩阵等),而不用尝试每个 is.vector(v)、is.list(v ) ... ?

【问题讨论】:

  • mode() 对此提供了一些见解,尽管它不会区分 data.frame()list()vector()matrix() 之间的 AFAIK。 data.frame()list() 的特殊类型,matrix() 只是带​​有一些 dim 属性的 vector()。根据您的需要,您可以随时查看一些源代码以了解其他作者如何解决此问题。
  • 谢谢!那么说matrix是vector的子类,data.frame是list的子类对吗?那么像 as.matrix(i.am.a.vector) 这样的转换类型的成本可以忽略不计?
  • @acai - 对于对象类的正确层次结构,我会听从其他人的意见,但输入的内容似乎最合理。以我的经验,通过as.matrix() 和朋友强迫物品实际上在宏伟的计划中是微不足道的......即每当我有一个足够长的函数来担心system.time()Rprof()as.matrix() 等人都会占用一小部分时间。

标签: r


【解决方案1】:

以下三个函数对您有帮助:modestrclass

首先,让我们做一些数据:

nlist <- list(a=c(1,2,3), b=c("a", "b", "c"), c=matrix(rnorm(10),5))
ndata.frame <- data.frame(a=c("a", "b", "c"), b=1:3)
ncharvec <- c("a", "b", "c")
nnumvec <- c(1, 2, 3)
nintvec <- 1:3

所以让我们使用我上面提到的函数:

mode(nlist)
[1] "list"

str(nlist)
List of 3
 $ a: num [1:3] 1 2 3
 $ b: chr [1:3] "a" "b" "c"
 $ c: num [1:5, 1:2] -0.9469 -0.0602 -0.3601 0.9594 -0.4348 ...

class(nlist)
[1] "list"

现在是数据框:

mode(ndata.frame)
[1] "list"

这可能会让您感到惊讶,但数据框只是一个带有 data.frame 类属性的列表。

str(ndata.frame)
'data.frame':   3 obs. of  2 variables:
 $ a: Factor w/ 3 levels "a","b","c": 1 2 3
 $ b: int  1 2 3
class(ndata.frame)
[1] "data.frame"

注意向量有不同的模式:

mode(ncharlist)
[1] "character"
mode(nnumvec)
[1] "numeric"
mode(nintvec)
[1] "numeric"

还看到虽然nnumvecnintvec 看起来相同,但它们却完全不同:

str(nnumvec)
 num [1:3] 1 2 3
str(nintvec)
 int [1:3] 1 2 3

class(nnumvec)
[1] "numeric"
class(nintvec)
[1] "integer"

根据您想要的其中哪一个来确定您使用什么功能。 str 通常是查看变量的好函数,而其他两个在函数中更有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-25
    • 2014-06-16
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    相关资源
    最近更新 更多