R 如何在保留小数的同时将整个数据帧转换为数字?

R 如何在保留小数的同时将整个数据帧转换为数字?,r,dataframe,numeric,R,Dataframe,Numeric,我有一个混合类dataframe(numeric和factor),我试图将整个数据帧转换为numeric。以下说明了我正在处理的数据类型以及遇到的问题: > a = as.factor(c(0.01,0.02,0.03,0.04)) > b = c(2,4,5,7) > df1 = data.frame(a,b) > class(df1$a) [1] "factor" > class(df1$b) [1] "numeric" 当我尝试将整个数据帧转换为数值时,它会

我有一个混合类dataframe(numeric和factor),我试图将整个数据帧转换为numeric。以下说明了我正在处理的数据类型以及遇到的问题:

> a = as.factor(c(0.01,0.02,0.03,0.04))
> b = c(2,4,5,7)
> df1 = data.frame(a,b)
> class(df1$a)
[1] "factor"
> class(df1$b)
[1] "numeric"
当我尝试将整个数据帧转换为数值时,它会改变数值。例如:

> df2 = as.data.frame(sapply(df1, as.numeric))
> class(df2$a)
[1] "numeric"
> df2
  a b
1 1 2
2 2 4
3 3 5
4 4 7
该网站上以前的帖子建议使用
as.numeric(as.character(df1$a))
,这对于一个专栏来说非常有用。但是,我需要将这种方法应用于可能包含数百列的数据帧

我可以选择哪些选项将整个数据帧从因子转换为数字,同时保留数字十进制值?

以下是我想产生的输出,其中
a
b
是数字:

     a b
1 0.01 2
2 0.02 4
3 0.03 5
4 0.04 7

我已经阅读了以下相关帖子,但没有一篇直接适用于本案例:

  • 这引用数据帧中的单个列
  • 。本帖 不考虑十进制值
  • 。这仅适用于数据帧中的一列
  • >df2 df2
    a b
    1 0.01 2
    2 0.02 4
    3 0.03 5
    4 0.04 7
    >sapply(df2级)
    a b
    “数字”“数字”
    
    您可能需要进行一些检查。无法安全地将因子直接转换为数字<代码>作为。必须首先应用字符。否则,因子将转换为其数值存储值。我会用
    is.factor
    检查每一列,然后根据需要强制为数字

    df1[] <- lapply(df1, function(x) {
        if(is.factor(x)) as.numeric(as.character(x)) else x
    })
    sapply(df1, class)
    #         a         b 
    # "numeric" "numeric" 
    
    df1[]
    df2使用
    dplyr
    (有点像sapply.)


    df2提问的好方法。可能会有帮助。这是对
    因子
    变量感到沮丧的常见原因。我可能错了,但这不会将数字列转换为字符,然后再转换为数字吗?@RichardScriven认为这是正确的。我想我的答案也有同样的问题,虽然我不认为它有什么问题。@n8sty不,它一点问题都没有,但似乎有点浪费。或者在循环之外做:
    is_factor@hadley-我一直在想这个问题。首先检查,然后在子集上运行更改更有效?与其在
    lappy
    循环中进行检查,不如考虑典型数据集的大小,我怀疑这会有多大区别
    df1[] <- lapply(df1, function(x) {
        if(is.factor(x)) as.numeric(as.character(x)) else x
    })
    sapply(df1, class)
    #         a         b 
    # "numeric" "numeric" 
    
    df2 <- data.frame(apply(df1, 2, function(x) as.numeric(as.character(x))))
    
    df2 <- mutate_all(df1, function(x) as.numeric(as.character(x)))
    
    glimpse(df2)
    Observations: 4
    Variables: 2
    $ a <dbl> 0.01, 0.02, 0.03, 0.04
    $ b <dbl> 2, 4, 5, 7
    
    glimpse(df1)
    Observations: 4
    Variables: 2
    $ a <fctr> 0.01, 0.02, 0.03, 0.04
    $ b <dbl> 2, 4, 5, 7