首页 文章

如何将数据框列转换为数字类型?

提问于
浏览
214

如何将数据框列转换为数字类型?

16 回答

  • 117

    如果 x 是dataframe dat 的列名,而 x 是因子类型,请使用:

    as.numeric(as.character(dat$x))
    
  • 14

    要将数据框列转换为数字,您只需执行以下操作: -

    要素到数字: -

    data_frame$column <- as.numeric(as.character(data_frame$column))
    
  • 0

    如果数据框有多种类型的列,某些字符,某些数字会尝试以下操作,只将包含数值的列转换为数字:

    for (i in 1:length(data[1,])){
      if(length(as.numeric(data[,i][!is.na(data[,i])])[!is.na(as.numeric(data[,i][!is.na(data[,i])]))])==0){}
      else {
        data[,i]<-as.numeric(data[,i])
      }
    }
    
  • 13

    考虑到可能存在char列,这是基于@Abdou在Get column types of excel sheet automatically回答:

    makenumcols<-function(df){
    df<-as.data.frame(df)
    cond <- apply(df, 2, function(x) {
      x <- x[!is.na(x)]
      all(suppressWarnings(!is.na(as.numeric(x))))
    })
    numeric_cols <- names(df)[cond]
    df[,numeric_cols] <- apply(df[,numeric_cols],2, as.character) # deals with factors
    df[,numeric_cols] <- sapply(df[,numeric_cols], as.numeric)
    return(df)
    }
    df<-makenumcols(df)
    
  • 6

    要将字符转换为数字,您必须通过应用将其转换为因子

    BankFinal1 <- transform(BankLoan,   LoanApproval=as.factor(LoanApproval))
    BankFinal1 <- transform(BankFinal1, LoanApp=as.factor(LoanApproval))
    

    您必须使用相同的数据创建两列,因为一列无法转换为数字 . 如果您进行一次转换,则会出现以下错误

    transform(BankData, LoanApp=as.numeric(LoanApproval))
    

    警告信息:
    在eval(substitute(list(...)),_ data,parent.frame())中:
    通过强制引入的NA

    所以,做了两列相同的数据后应用

    BankFinal1 < transform(BankFinal1, LoanApp      = as.numeric(LoanApp), 
                                       LoanApproval = as.numeric(LoanApproval))
    

    它会成功地将字符转换为数字

  • 10

    我会添加评论(不能评价低)

    只需添加user276042和pangratz

    dat$x = as.numeric(as.character(dat$x))
    

    这将覆盖现有列x的值

  • 3

    蒂姆是对的,谢恩有一个遗漏 . 以下是其他示例:

    R> df <- data.frame(a = as.character(10:15))
    R> df <- data.frame(df, num = as.numeric(df$a), 
                            numchr = as.numeric(as.character(df$a)))
    R> df
       a num numchr
    1 10   1     10
    2 11   2     11
    3 12   3     12
    4 13   4     13
    5 14   5     14
    6 15   6     15
    R> summary(df)
      a          num           numchr    
     10:1   Min.   :1.00   Min.   :10.0  
     11:1   1st Qu.:2.25   1st Qu.:11.2  
     12:1   Median :3.50   Median :12.5  
     13:1   Mean   :3.50   Mean   :12.5  
     14:1   3rd Qu.:4.75   3rd Qu.:13.8  
     15:1   Max.   :6.00   Max.   :15.0  
    R>
    

    我们的 data.frame 现在有一个因子列的摘要(计数)和 as.numeric() 的数字摘要---这是错误的,因为它得到了数字因子水平---和 as.numeric(as.character()) 的(正确)摘要 .

  • 19

    如果您遇到以下问题:

    as.numeric(as.character(dat$x))
    

    看看你的小数点 . 如果它们是“,”而不是“ . ” (例如“5,3”)以上不起作用 .

    可能的解决方案是:

    as.numeric(gsub(",", ".", dat$x))
    

    我相信这在一些非英语国家很常见 .

  • 10

    由于(仍然)没有人得到复选标记,我认为你有一些实际问题,主要是因为你没有指定你想要转换为 numeric 的矢量类型 . 我建议你应该使用 transform 函数来完成你的任务 .

    现在我要证明某些“转换异常”:

    # create dummy data.frame
    d <- data.frame(char = letters[1:5], 
                    fake_char = as.character(1:5), 
                    fac = factor(1:5), 
                    char_fac = factor(letters[1:5]), 
                    num = 1:5, stringsAsFactors = FALSE)
    

    让我们一瞥 data.frame

    > d
      char fake_char fac char_fac num
    1    a         1   1        a   1
    2    b         2   2        b   2
    3    c         3   3        c   3
    4    d         4   4        d   4
    5    e         5   5        e   5
    

    让我们运行:

    > sapply(d, mode)
           char   fake_char         fac    char_fac         num 
    "character" "character"   "numeric"   "numeric"   "numeric" 
    > sapply(d, class)
           char   fake_char         fac    char_fac         num 
    "character" "character"    "factor"    "factor"   "integer"
    

    现在你可能会问自己“哪里有异常?”好吧,我在R中碰到了很奇怪的东西,这不是最令人困惑的东西,但它会让你感到困惑,特别是如果你在睡觉之前读到这个 .

    这里是:前两列是 character . 我故意叫第二个 fake_char . 发现这个 character 变量与Dirk在回复中创建的变量的相似性 . 它实际上是一个 numerical 向量转换为 character . 第3和第4列是 factor ,最后一列是"purely" numeric .

    如果使用 transform 函数,则可以将 fake_char 转换为 numeric ,而不是 char 变量本身 .

    > transform(d, char = as.numeric(char))
      char fake_char fac char_fac num
    1   NA         1   1        a   1
    2   NA         2   2        b   2
    3   NA         3   3        c   3
    4   NA         4   4        d   4
    5   NA         5   5        e   5
    Warning message:
    In eval(expr, envir, enclos) : NAs introduced by coercion
    

    但是如果你在 fake_charchar_fac 做同样的事情,你'll be lucky, and get away with no NA':

    > transform(d, fake_char = as.numeric(fake_char), 
                   char_fac = as.numeric(char_fac))
    
      char fake_char fac char_fac num
    1    a         1   1        1   1
    2    b         2   2        2   2
    3    c         3   3        3   3
    4    d         4   4        4   4
    5    e         5   5        5   5
    

    如果您保存已转换的 data.frame 并检查 modeclass ,您将获得:

    > D <- transform(d, fake_char = as.numeric(fake_char), 
                        char_fac = as.numeric(char_fac))
    
    > sapply(D, mode)
           char   fake_char         fac    char_fac         num 
    "character"   "numeric"   "numeric"   "numeric"   "numeric" 
    > sapply(D, class)
           char   fake_char         fac    char_fac         num 
    "character"   "numeric"    "factor"   "numeric"   "integer"
    

    所以,结论是: Yes, you can convert character vector into a numeric one, but only if it's elements are "convertible" to numeric. 如果向量中只有一个 character 元素,那么在尝试将该向量转换为 numerical 时会出错 .

    只是为了证明我的观点:

    > err <- c(1, "b", 3, 4, "e")
    > mode(err)
    [1] "character"
    > class(err)
    [1] "character"
    > char <- as.numeric(err)
    Warning message:
    NAs introduced by coercion 
    > char
    [1]  1 NA  3  4 NA
    

    而现在,只是为了好玩(或练习),尝试猜测这些命令的输出:

    > fac <- as.factor(err)
    > fac
    ???
    > num <- as.numeric(fac)
    > num
    ???
    

    亲切的问候Patrick Burns! =)

  • 2

    使用 type.convert()rapply() 的通用方式:

    convert_types <- function(x) {
        stopifnot(is.list(x))
        x[] <- rapply(x, utils::type.convert, classes = "character",
                      how = "replace", as.is = TRUE)
        return(x)
    }
    d <- data.frame(char = letters[1:5], 
                    fake_char = as.character(1:5), 
                    fac = factor(1:5), 
                    char_fac = factor(letters[1:5]), 
                    num = 1:5, stringsAsFactors = FALSE)
    sapply(d, class)
    #>        char   fake_char         fac    char_fac         num 
    #> "character" "character"    "factor"    "factor"   "integer"
    sapply(convert_types(d), class)
    #>        char   fake_char         fac    char_fac         num 
    #> "character"   "integer"    "factor"    "factor"   "integer"
    
  • 231

    在我的电脑(R v.3.2.3)中, applysapply 给出错误 . lapply 运作良好 .

    dt[,2:4] <- lapply(dt[,2:4], function (x) as.factor(as.numeric(x)))
    
  • 0

    对我有帮助的东西:如果要转换的变量范围(或者只有一个变量),你可以使用 sapply .

    有点荒谬,但仅举例如:

    data(cars)
    cars[, 1:2] <- sapply(cars[, 1:2], as.factor)
    

    假设您的数据帧的第3,6-15和37列需要转换为数字,可以:

    dat[, c(3,6:15,37)] <- sapply(dat[, c(3,6:15,37)], as.numeric)
    
  • 0

    虽然您的问题严格依赖于数字,但在开始使用R时,很多转换都很难理解 . 我的目标是解决方法问题 . 这个问题类似于This Question .

    类型转换可能是R的痛苦,因为(1)因素不能直接转换为数字,它们需要先转换为字符类,(2)日期是您通常需要单独处理的特殊情况,以及(3)跨数据帧列循环可能很棘手 . 幸运的是,“tidyverse”解决了大部分问题 .

    此解决方案使用 mutate_each() 将函数应用于数据框中的所有列 . 在这种情况下,我们想要应用 type.convert() 函数,它可以将字符串转换为数字 . 因为R喜欢因素(不确定为什么)应该保持字符的字符列变为因子 . 要解决此问题, mutate_if() 函数用于检测作为因子的列并更改为字符 . 最后,我想展示如何使用lubridate将字符类中的时间戳更改为日期时间,因为这也是通常是初学者的坚持块 .

    library(tidyverse) 
    library(lubridate)
    
    # Recreate data that needs converted to numeric, date-time, etc
    data_df
    #> # A tibble: 5 × 9
    #>             TIMESTAMP SYMBOL    EX  PRICE  SIZE  COND   BID BIDSIZ   OFR
    #>                 <chr>  <chr> <chr>  <chr> <chr> <chr> <chr>  <chr> <chr>
    #> 1 2012-05-04 09:30:00    BAC     T 7.8900 38538     F  7.89    523  7.90
    #> 2 2012-05-04 09:30:01    BAC     Z 7.8850   288     @  7.88  61033  7.90
    #> 3 2012-05-04 09:30:03    BAC     X 7.8900  1000     @  7.88   1974  7.89
    #> 4 2012-05-04 09:30:07    BAC     T 7.8900 19052     F  7.88   1058  7.89
    #> 5 2012-05-04 09:30:08    BAC     Y 7.8900 85053     F  7.88 108101  7.90
    
    # Converting columns to numeric using "tidyverse"
    data_df %>%
        mutate_all(type.convert) %>%
        mutate_if(is.factor, as.character) %>%
        mutate(TIMESTAMP = as_datetime(TIMESTAMP, tz = Sys.timezone()))
    #> # A tibble: 5 × 9
    #>             TIMESTAMP SYMBOL    EX PRICE  SIZE  COND   BID BIDSIZ   OFR
    #>                <dttm>  <chr> <chr> <dbl> <int> <chr> <dbl>  <int> <dbl>
    #> 1 2012-05-04 09:30:00    BAC     T 7.890 38538     F  7.89    523  7.90
    #> 2 2012-05-04 09:30:01    BAC     Z 7.885   288     @  7.88  61033  7.90
    #> 3 2012-05-04 09:30:03    BAC     X 7.890  1000     @  7.88   1974  7.89
    #> 4 2012-05-04 09:30:07    BAC     T 7.890 19052     F  7.88   1058  7.89
    #> 5 2012-05-04 09:30:08    BAC     Y 7.890 85053     F  7.88 108101  7.90
    
  • 68

    虽然其他人已经很好地讨论了这个话题,但我想补充一下这个额外的快速思路/提示 . 您可以使用regexp提前检查字符是否可能只包含数字 .

    for(i in seq_along(names(df)){
         potential_numcol[i] <- all(!grepl("[a-zA-Z]",d[,i]))
    }
    # and now just convert only the numeric ones
    d <- sapply(d[,potential_numcol],as.numeric)
    

    对于更复杂的正则表达式和一个简洁的学习/体验他们的力量,请看这个非常好的网站:http://regexr.com/

  • 0

    使用以下代码,您可以将所有数据框列转换为数字(X是我们要转换它的列的数据框):

    as.data.frame(lapply(X, as.numeric))
    

    并且为了将整个矩阵转换为数字,您有两种方式:要么:

    mode(X) <- "numeric"
    

    要么:

    X <- apply(X, 2, as.numeric)
    

    或者,您可以使用 data.matrix 函数将所有内容转换为数字,但请注意,这些因素可能无法正确转换,因此将所有内容转换为 character 更安全:

    X <- sapply(X, as.character)
    X <- data.matrix(X)
    

    我通常使用 this last one 如果我想 to convert to matrix and numeric simultaneously

  • 0

    hablar::convert

    要轻松将多列转换为不同的数据类型,您可以使用 hablar::convert . 语法简单: df %>% convert(num(a)) 将列a从df转换为数字 .

    Detailed example

    让我们将 mtcars 的所有列转换为字符 .

    df <- mtcars %>% mutate_all(as.character) %>% as_tibble()
    
    > df
    # A tibble: 32 x 11
       mpg   cyl   disp  hp    drat  wt    qsec  vs    am    gear  carb 
       <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
     1 21    6     160   110   3.9   2.62  16.46 0     1     4     4    
     2 21    6     160   110   3.9   2.875 17.02 0     1     4     4    
     3 22.8  4     108   93    3.85  2.32  18.61 1     1     4     1
    

    使用 hablar::convert

    library(hablar)
    
    # Convert columns to integer, numeric and factor
    df %>% 
      convert(int(cyl, vs),
              num(disp:wt),
              fct(gear))
    

    结果是:

    # A tibble: 32 x 11
       mpg     cyl  disp    hp  drat    wt qsec     vs am    gear  carb 
       <chr> <int> <dbl> <dbl> <dbl> <dbl> <chr> <int> <chr> <fct> <chr>
     1 21        6  160    110  3.9   2.62 16.46     0 1     4     4    
     2 21        6  160    110  3.9   2.88 17.02     0 1     4     4    
     3 22.8      4  108     93  3.85  2.32 18.61     1 1     4     1    
     4 21.4      6  258    110  3.08  3.22 19.44     1 0     3     1
    

相关问题