Разница между 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
Ответы
Ответ 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