R数据帧所有列(因子)列到十进制

时间:2017-01-25 03:20:23

标签: r sapply

它的简单问题但看起来在stackoverflow中不存在

我有一个数据框,其中所有列都是我要将其转换为小数的因子。

  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 个答案:

答案 0 :(得分:2)

如果它们是真正的因素,您需要经历另一个步骤:

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]))
     }

答案 1 :(得分:2)

这也应该有效:

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

答案 2 :(得分:1)

我们可以使用dplyrfactor列转换为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")