Подтвердить что ты не робот

Разница между as.data.frame(x) и data.frame(x)

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

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

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
4b9b3361

Ответ 1

Как упоминалось Jaap, 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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Try

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

и тогда оба дадут тот же результат

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

Чем более поразительны такие вещи, как:

> list(x)

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

as.list(x)

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

ММ

Ответ 5

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

> 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