(R) 关于在 R 中将数据帧转换为矩阵时类型强制的问题
(R) Question regarding type coercion when converting a data frame to a matrix in R
很抱歉提出了一些基本的问题,但我无法轻易找到任何答案,而且我只想对事情进行一些可靠的确认。
我有一个包含数字、因子和有序因子变量的数据框,当我使用 as.matrix 将其转换为矩阵时,我注意到矩阵的元素都是字符。从这次经历中,我有 2 个问题;
首先,我说向量和矩阵只能包含一种数据类型是否正确,这就是发生强制转换的原因?
其次,更重要的是,数据框中哪些数据类型的组合导致字符矩阵与数字矩阵等?例如如果我的 df 中只有逻辑、整数和数字类型,我想我会得到一个数字矩阵,这是正确的吗?那么,是否只是在我的数据框中包含因子、有序因子 and/or 个字符,当转换为矩阵时,会导致每个元素强制转换为一个字符?
非常感谢阅读,如有任何帮助我们将不胜感激:]
第一个问题的答案:是和否。
实际上,矩阵是具有 dim
属性的向量。
并且向量必须通常只有一种数据类型。 list
是一个例外:它是一个 vector
with list
模式,列表也可能有一个 dim
属性。
例如:
> is.vector(list(1, "a", T))
[1] TRUE
> mode(list(1, "a", T))
[1] "list"
> a <- structure(list(1, "a", T, 1+2i), dim = c(2, 2))
> is.matrix(a)
[1] TRUE
> a
[,1] [,2]
[1,] 1 TRUE
[2,] "a" 1+2i
但这仍然可能是 as.matrix
进行强制转换的原因:将所有内容转换为单一类型并处理具有单一类型元素的矩阵要容易得多。
但是,这是 as.matrix
做出的 选择,虽然我认为不可取,但可以将 data.frame 转换为 list-matrix,同时保持所有数据类型不变。
这将是低效的:向量可以存储在连续的内存位置,这意味着 1/ 存储元素数据类型时不会浪费内存,以及 2/ 使用向量化代码进行更快的处理 3/ 外部 C 或 Fortran 代码需要连续的数据类型,处理列表会很麻烦且无用。我从未见过 list-matrix 实际使用过,但我想它在某些情况下可能会有所帮助。
第二个问题的答案在as.matrix
的文档中:
as.matrix is a generic function. The method for data frames will
return a character matrix if there is only atomic columns and any
non-(numeric/logical/complex) column, applying as.vector to factors
and format to other non-character columns. Otherwise, the usual
coercion hierarchy (logical < integer < double < complex) will be
used, e.g., all-logical data frames will be coerced to a logical
matrix, mixed logical-integer will give a integer matrix, etc.
你也可以看看as.matrix.data.frame
的源代码。
很抱歉提出了一些基本的问题,但我无法轻易找到任何答案,而且我只想对事情进行一些可靠的确认。
我有一个包含数字、因子和有序因子变量的数据框,当我使用 as.matrix 将其转换为矩阵时,我注意到矩阵的元素都是字符。从这次经历中,我有 2 个问题;
首先,我说向量和矩阵只能包含一种数据类型是否正确,这就是发生强制转换的原因?
其次,更重要的是,数据框中哪些数据类型的组合导致字符矩阵与数字矩阵等?例如如果我的 df 中只有逻辑、整数和数字类型,我想我会得到一个数字矩阵,这是正确的吗?那么,是否只是在我的数据框中包含因子、有序因子 and/or 个字符,当转换为矩阵时,会导致每个元素强制转换为一个字符?
非常感谢阅读,如有任何帮助我们将不胜感激:]
第一个问题的答案:是和否。
实际上,矩阵是具有 dim
属性的向量。
并且向量必须通常只有一种数据类型。 list
是一个例外:它是一个 vector
with list
模式,列表也可能有一个 dim
属性。
例如:
> is.vector(list(1, "a", T))
[1] TRUE
> mode(list(1, "a", T))
[1] "list"
> a <- structure(list(1, "a", T, 1+2i), dim = c(2, 2))
> is.matrix(a)
[1] TRUE
> a
[,1] [,2]
[1,] 1 TRUE
[2,] "a" 1+2i
但这仍然可能是 as.matrix
进行强制转换的原因:将所有内容转换为单一类型并处理具有单一类型元素的矩阵要容易得多。
但是,这是 as.matrix
做出的 选择,虽然我认为不可取,但可以将 data.frame 转换为 list-matrix,同时保持所有数据类型不变。
这将是低效的:向量可以存储在连续的内存位置,这意味着 1/ 存储元素数据类型时不会浪费内存,以及 2/ 使用向量化代码进行更快的处理 3/ 外部 C 或 Fortran 代码需要连续的数据类型,处理列表会很麻烦且无用。我从未见过 list-matrix 实际使用过,但我想它在某些情况下可能会有所帮助。
第二个问题的答案在as.matrix
的文档中:
as.matrix is a generic function. The method for data frames will return a character matrix if there is only atomic columns and any non-(numeric/logical/complex) column, applying as.vector to factors and format to other non-character columns. Otherwise, the usual coercion hierarchy (logical < integer < double < complex) will be used, e.g., all-logical data frames will be coerced to a logical matrix, mixed logical-integer will give a integer matrix, etc.
你也可以看看as.matrix.data.frame
的源代码。