为什么在使用table()后浮点数被视为整数?

时间:2016-02-26 12:40:31

标签: r types

我有一个类型为double的浮点数向量:

> typeof(globals$out$data$randrating)
[1] "double"

在我将其转换为表格后,相同的值会返回integer

> data_rating <- as.data.frame(table(globals$out$data$randrating))
> colnames(data_rating) <- c("rating", "freq")
> typeof(data_rating$rating)
[1] "integer"

要查看data_rating中的数据:

> data_rating

   | rating | freq
1  |      4 |  312
2  |    7.1 |  324
3  |      8 |  340
4  |    8.5 |  962
5  |    8.7 | 1640

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

原因是第一列是factor,我们使用typeof看到的是整数表示。您可以使用class查找实际的class

如果我们查看table输出,则names部分是character向量。当我们使用data.frame将其转换为as.data.frame时,character元素会转换为factor,默认为stringsAsFactors=TRUE data.frame。如果我们使用as.data.frame(...., stringsAsFactors=FALSE),则会更改typeof

作为一个可重复的例子,

 set.seed(24)
 v1 <- sample(c(1:20, 14.5, 18.2), 200, replace=TRUE)
 tbl <- table(v1)
 str(tbl)
 # 'table' int [1:22(1d)] 7 9 10 11 12 10 7 10 13 6 ...
 #- attr(*, "dimnames")=List of 1
 # ..$ v1: chr [1:22] "1" "2" "3" "4" ...

 d1 <- as.data.frame(tbl)
 str(d1)
 # 'data.frame':   22 obs. of  2 variables:
 # $ v1  : Factor w/ 22 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
 # $ Freq: int  7 9 10 11 12 10 7 10 13 6 ...

 class(d1$v1)
 #[1] "factor"
 typeof(d1$v1)
 #[1] "integer"
 mode(d1$v1)
 #[1] "numeric"

使用stringsAsFactors=FALSE

 d2 <- as.data.frame(tbl, stringsAsFactors=FALSE)
 class(d2$v1)
 #[1] "character"
 typeof(d2$v1)
 #[1] "character"
 mode(d2$v1)
 #[1] "character"

前一个存储空间modenumeric,此为character