R данные переводят все столбцы (множители) в десятичные

Это простой вопрос, но похоже, что он не существует в стеке

У меня есть фрейм данных, где все столбцы являются факторами, которые я хочу преобразовать в десятичные.

  Var1 Var2 Var3 Var4
1 0.76 0.84 0.76 0.73
2 0.76 0.84 0.76 0.73
3 0.76 0.84 0.76 0.73
4 0.76 0.84 0.76 0.73
5 0.76 0.84 0.76 0.73
6 0.76 0.84 0.76 0.73

Я хочу преобразовать это без потери десятичных дробей.

df <- sapply(df, as.numeric)

Это не сохраняет десятичные дроби.

3 ответа

Это также должно работать:

df[] <- lapply(df, function(x) ifelse(is.numeric(x), as.numeric(x), x))

Если они действительно являются факторами, вам нужно пройти еще один шаг:

Причина для as.numeric не работает напрямую, потому что внутри каждого фактора хранится его levels, Вы можете получить доступ к этому через levels(factor_var), Поэтому, когда вы подаете заявку as.numeric непосредственно к фактору возвращается levels, Поэтому сначала сделайте его персонажем, а затем примените as.numeric

df <- sapply(df, as.character)
df <- sapply(df, as.numeric)

Или вы можете вложить их в функцию:

convert_func<-function(x){  as.numeric(as.character(x))}

затем:df <- sapply(df, convert_func)

Я никогда не пытался вложить их в apply/lapply/sapply без функции, но это также может сработать. или вы можете сделать цикл:

for (col in 1:ncol(df){ 
     df[col]<-as.numeric(as.character(df[col]))
     }

Мы можем использовать dplyr преобразовать factor столбцы в numeric

library(dplyr)
library(magrittr)
df %<>%
   mutate_if(is.factor, funs(as.numeric(as.character(.))))

С base R, мы можем

df[] <- lapply(df, function(x) if(is.factor(x)) as.numeric(as.character(x)) else x)

данные

df <- structure(list(Var1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L), 
.Label = "0.76", class = "factor"), 
Var2 = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "0.84", class = "factor"), 
Var3 = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "0.76", class = "factor"), 
Var4 = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "0.73", class = "factor")),
 .Names = c("Var1", "Var2", "Var3", "Var4"), row.names = c("1", "2", "3", "4", "5", 
"6"), class = "data.frame")
Другие вопросы по тегам