With anna.table
(顺便说一下,它是一个数据框,表格是别的东西!),最简单的方法就是这样做:
anna.table2 <- data.matrix(anna.table)
as data.matrix()
将因子转换为其基础数字(整数)水平。这适用于仅包含数字、整数、因子或其他可以强制为数字的变量的数据框,但任何字符串(字符)都会导致矩阵变成字符矩阵。
如果你想anna.table2
成为数据框,而不是矩阵,那么您可以随后执行以下操作:
anna.table2 <- data.frame(anna.table2)
其他选项是将所有因子变量强制为其整数级别。这是一个例子:
## dummy data
set.seed(1)
dat <- data.frame(a = factor(sample(letters[1:3], 10, replace = TRUE)),
b = runif(10))
## sapply over `dat`, converting factor to numeric
dat2 <- sapply(dat, function(x) if(is.factor(x)) {
as.numeric(x)
} else {
x
})
dat2 <- data.frame(dat2) ## convert to a data frame
这使:
> str(dat)
'data.frame': 10 obs. of 2 variables:
$ a: Factor w/ 3 levels "a","b","c": 1 2 2 3 1 3 3 2 2 1
$ b: num 0.206 0.177 0.687 0.384 0.77 ...
> str(dat2)
'data.frame': 10 obs. of 2 variables:
$ a: num 1 2 2 3 1 3 3 2 2 1
$ b: num 0.206 0.177 0.687 0.384 0.77 ...
但是,请注意,仅当您需要底层数字表示时,上述方法才有效。如果您的因子本质上具有数字级别,那么我们需要更聪明地将因子转换为数字,同时保留级别中编码的“数字”信息。这是一个例子:
## dummy data
set.seed(1)
dat3 <- data.frame(a = factor(sample(1:3, 10, replace = TRUE), levels = 3:1),
b = runif(10))
## sapply over `dat3`, converting factor to numeric
dat4 <- sapply(dat3, function(x) if(is.factor(x)) {
as.numeric(as.character(x))
} else {
x
})
dat4 <- data.frame(dat4) ## convert to a data frame
注意我们需要怎么做as.character(x)
在我们这样做之前首先as.numeric()
。在我们将级别信息转换为数字之前,额外的调用会对级别信息进行编码。要了解为什么这很重要,请注意以下内容dat3$a
is
> dat3$a
[1] 1 2 2 3 1 3 3 2 2 1
Levels: 3 2 1
如果我们只是将其转换为数字,我们会得到错误的数据,因为 R 转换了底层代码
> as.numeric(dat3$a)
[1] 3 2 2 1 3 1 1 2 2 3
如果我们首先将因子强制转换为字符向量,然后转换为数字向量,我们将保留原始信息而不是 R 的内部表示
> as.numeric(as.character(dat3$a))
[1] 1 2 2 3 1 3 3 2 2 1
如果您的数据类似于第二个示例,那么您不能使用简单的data.matrix()
技巧与应用相同as.numeric()
直接到因子,如第二个示例所示,这不会保留原始信息。