2014-02-05 4 views
24

В чем разница между as.data.frame (х) и data.frame (х)Разница между as.data.frame (х) и data.frame (х)

В этом следующем примере, результат тот же, за исключением имен колонок.

x <- matrix(data=rep(1,9),nrow=3,ncol=3) 
> x 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 1 1 1 
[3,] 1 1 1 
> data.frame(x) 
    X1 X2 X3 
1 1 1 1 
2 1 1 1 
3 1 1 1 
> as.data.frame(x) 
    V1 V2 V3 
1 1 1 1 
2 1 1 1 
3 1 1 1 
+0

См инструкции: [as.data.frame] (http://stat.ethz.ch/R-manual/R-devel /library/base/html/as.data.frame.html) vs [data.frame] (http://stat.ethz.ch/R-manual/R-devel/library/base/html/data.frame. html) – zx8754

+8

Чтобы еще больше запутать вещи, попробуйте 'as (x," data.frame ")'. –

ответ

11

Как отметил Яап, data.frame() называет as.data.frame(), но есть причины для этого:

as.data.frame() является способ, чтобы заставить другие объекты класса data.frame. Если вы пишете свой собственный пакет, вы сохраните свой метод для преобразования объекта your_class под номером as.data.frame.your_class(). Вот несколько примеров.

methods(as.data.frame) 
[1] as.data.frame.AsIs   as.data.frame.Date   
[3] as.data.frame.POSIXct   as.data.frame.POSIXlt   
[5] as.data.frame.aovproj*  as.data.frame.array   
[7] as.data.frame.character  as.data.frame.complex   
[9] as.data.frame.data.frame  as.data.frame.default   
[11] as.data.frame.difftime  as.data.frame.factor   
[13] as.data.frame.ftable*   as.data.frame.integer   
[15] as.data.frame.list   as.data.frame.logLik*   
[17] as.data.frame.logical   as.data.frame.matrix   
[19] as.data.frame.model.matrix as.data.frame.numeric   
[21] as.data.frame.numeric_version as.data.frame.ordered   
[23] as.data.frame.raw    as.data.frame.table   
[25] as.data.frame.ts    as.data.frame.vector   

    Non-visible functions are asterisked 
7

Как уже отмечалось, результат не немного отличается, и это означает, что они не точно равны:

identical(data.frame(x),as.data.frame(x)) 
[1] FALSE 

Так что вам, возможно, придется позаботиться, чтобы быть последовательным в какой из них вы используете.

Но также стоит отметить, что as.data.frame быстрее:

library(microbenchmark) 
microbenchmark(data.frame(x),as.data.frame(x)) 
Unit: microseconds 
      expr min  lq median  uq  max neval 
    data.frame(x) 71.446 73.616 74.80 78.9445 146.442 100 
as.data.frame(x) 25.657 27.631 28.42 29.2100 93.155 100 

y <- matrix(1:1e6,1000,1000) 
microbenchmark(data.frame(y),as.data.frame(y)) 
Unit: milliseconds 
      expr  min  lq median  uq  max neval 
    data.frame(y) 17.23943 19.63163 23.60193 41.07898 130.66005 100 
as.data.frame(y) 10.83469 12.56357 14.04929 34.68608 38.37435 100 
1

Попробуйте

> colnames(x)<-c("C1","C2","C3") 

, а затем оба дают одинаковый результат

> identical(data.frame(x), as.data.frame(x)) 

Что более поразительными являются следующие вещи:

> list(x) 

Предоставляет одноэлементный список, элемент которого является матрицей x; в то время как

as.list(x) 

дает список с 9 элементов, по одному для каждой записи матрицы

ММ

6

data.frame() может быть использована для создания кадра данных в то время как as.data.frame() может быть использован только для принуждения другого объекта к кадр данных.

, например:

> # data.frame() 
> df1 <- data.frame(matrix(1:12,3,4),1:3) 

> # as.data.frame() 
> df2 <- as.data.frame(matrix(1:12,3,4),1:3) 

> df1 
    X1 X2 X3 X4 X1.3 
1 1 4 7 10 1 
2 2 5 8 11 2 
3 3 6 9 12 3 

> df2 
    V1 V2 V3 V4 
1 1 4 7 10 
2 2 5 8 11 
3 3 6 9 12 
+1

Не обязательно. Попробуйте 'is.object (1: 5); as.data.frame (1: 5) ' –

0

Глядя на код, as.data.frame удается быстрее. data.frame будет выдавать предупреждения, и делать такие вещи, как удалить rownames, если есть дубликаты:

> x <- matrix(data=rep(1,9),nrow=3,ncol=3) 
> rownames(x) <- c("a", "b", "b") 
> data.frame(x) 
    X1 X2 X3 
1 1 1 1 
2 1 1 1 
3 1 1 1 
Warning message: 
In data.row.names(row.names, rowsi, i) : 
    some row.names duplicated: 3 --> row.names NOT used 

> as.data.frame(x) 
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names =   
TRUE, : 
    duplicate row.names: b 
Смежные вопросы