С anna.table
(кстати, это фрейм данных, таблица - это нечто иное!), Самый простой способ будет просто сделать:
anna.table2 <- data.matrix(anna.table)
, поскольку 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
равно
> 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()
непосредственно к фактору, и, как показывает этот второй пример, он не сохраняет исходную информацию.