2016-02-26 2 views
0

У меня есть вектор чисел с плавающей точкой типа 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" 

Чтобы увидеть, что данные выглядят in 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

Причина в том, что первый столбец 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" 

хранения mode является numeric для предыдущего и это character для этого.

+0

Спасибо! Знаете ли вы после этого, как проверить, являются ли данные типа integer или float? Я столкнулся с чем-то вроде 'typeof (as.numeric (as.character (data_rating $ rating))', но он всегда возвращает 'double', даже если данные являются целыми числами. Мне нужно проверить, являются ли данные в' data_rating $ rating' имеют тип integer или float. –

+0

@YohanObadia Вы можете использовать '? class' ie' class (10.1) # [1] "numeric" 'и' class (10L) # [1] "integer" ' – akrun

+0

'> class (as.numeric (as.character (data_rating $ rating))) [1] "numeric" ' '> class (data_rating $ rating) [1] "factor" ' '> typeof (unclass (data_rating $) рейтинг)) [1] "integer" 'но они float ... –

Смежные вопросы