在R中使用attributes()和as.numeric()/ as.factor()等有什么区别?

时间:2016-01-14 11:43:19

标签: r

我试图找出我们在强制类型后得到的两种结构之间的区别。 str()的初始输出是首先共享的,第二个是使用属性进行强制类型输出后的输出。这两者有区别吗?我似乎无法在str()输出中找到它的行为方式的差异。当我们使用attributes()并说as.numeric()时,为什么str()的输出不同?

 data_test <- iris
 str(data_test)

#'data.frame':  150 obs. of  5 variables:
# $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
# $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 #1 1 1 ...
 cols <- names(data_test)
 classes_cols <- c("numeric","numeric","numeric","numeric","factor")

 for (i in (1:length(cols))){
   attributes(obj = data_test[,(cols[i])])$class <- classes_cols[i]
 }

 str(data_test)

#'data.frame':  150 obs. of  5 variables:
# $ Sepal.Length:Class 'numeric'  num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# $ Sepal.Width :Class 'numeric'  num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# $ Petal.Length:Class 'numeric'  num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# $ Petal.Width :Class 'numeric'  num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
# $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

1 个答案:

答案 0 :(得分:1)

这里的区别在于一个人有一个属性,另一个人没有。属性&#34; class&#34;由str特别处理,因为它可能引用S3类对象。

> x=runif(10)
> str(x)
 num [1:10] 0.9621 0.4369 0.0911 0.2425 0.6501 ...
> attr(x,"class")="foo"
> str(x)
Class 'foo'  num [1:10] 0.9621 0.4369 0.0911 0.2425 0.6501 ...

大多数情况下,R并不关心像这样的向量上的属性,但是日常和时间类的内容在数据框中整齐地打印出来。

向量不需要类属性来创建类:

> x = runif(10)
> class(x)
[1] "numeric"
> attr(x,"class")
NULL

因此,这里的打印差异完全取决于具有类属性的向量,当它不需要时。