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

acr*_*roa 247 r type-conversion dataframe

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

aL3*_*3xa 257

由于(仍然)没有人得到复选标记,我认为你有一些实际问题,主要是因为你没有指定你想要转换成什么类型​​的矢量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)
Run Code Online (Sandbox Code Playgroud)

让我们一瞥 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
Run Code Online (Sandbox Code Playgroud)

让我们运行:

> 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" 
Run Code Online (Sandbox Code Playgroud)

现在你可能会问自己"哪里有异常?" 嗯,我碰到了很奇特的事情R,这是不是最混杂的东西,但它可以迷惑你,特别是如果你滚进睡前阅读.

这里是:前两列是character.我故意打电话给第二fake_char.找出这个character变量与Dirk在他的回复中创建的变量的相似性.它实际上是一个numerical转换为的向量character.3 和4 的列是factor,最后一个是"纯粹的" 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
Run Code Online (Sandbox Code Playgroud)

但如果你在做同样的事情,fake_charchar_fac,你会很幸运,并摆脱无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
Run Code Online (Sandbox Code Playgroud)

如果您保存已转换data.frame并检查mode并且class,您将获得:

> 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"
Run Code Online (Sandbox Code Playgroud)

因此,结论是:是的,您可以将character矢量转换为numeric一个,但numeric前提是它的元素是"可转换"的.如果character向量中只有一个元素,那么在尝试将该向量转换为numerical1 时会出错.

只是为了证明我的观点:

> 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
Run Code Online (Sandbox Code Playgroud)

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

> fac <- as.factor(err)
> fac
???
> num <- as.numeric(fac)
> num
???
Run Code Online (Sandbox Code Playgroud)

亲切的问候帕特里克伯恩斯!=)

  • 'stringsAsFactors = FALSE'对于读取数据文件很重要. (6认同)
  • 我知道这是旧的......但是......为什么你选择transform()而不是df $ fake_char < - as.integer(df $ fake_char)?在R中有多种方法可以执行相同的操作,我无法理解"正确"的方法.谢谢. (4认同)

Jay*_*Jay 129

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

有点荒谬,但仅举例如:

data(cars)
cars[, 1:2] <- sapply(cars[, 1:2], as.factor)
Run Code Online (Sandbox Code Playgroud)

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

dat[, c(3,6:15,37)] <- sapply(dat[, c(3,6:15,37)], as.numeric)
Run Code Online (Sandbox Code Playgroud)

  • 上面代码中的 as.factor 使列字符 (2认同)

小智 83

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

as.numeric(as.character(dat$x))
Run Code Online (Sandbox Code Playgroud)

  • 添加`as.character`确实是我想要的.否则转换有时会出错.至少在我的情况下. (3认同)
  • 如果你对一个因子做 as.numeric ,它会将级别转换为数字而不是实际值。因此需要 as.character 首先将因子转换为字符,然后转换为 as.numeric (2认同)

Som*_*mum 22

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

只需添加user276042和pangratz

dat$x = as.numeric(as.character(dat$x))
Run Code Online (Sandbox Code Playgroud)

这将覆盖现有列x的值


Dir*_*tel 15

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

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> 
Run Code Online (Sandbox Code Playgroud)

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

  • 我的荣幸。这是该语言中最愚蠢的角落之一,我认为它在较旧的“R Gotchas”问题中有所体现。 (2认同)

Mat*_*cho 15

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

类型转换可能是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
Run Code Online (Sandbox Code Playgroud)


Meh*_*ian 14

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

as.data.frame(lapply(X, as.numeric))
Run Code Online (Sandbox Code Playgroud)

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

mode(X) <- "numeric"
Run Code Online (Sandbox Code Playgroud)

要么:

X <- apply(X, 2, as.numeric)
Run Code Online (Sandbox Code Playgroud)

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

X <- sapply(X, as.character)
X <- data.matrix(X)
Run Code Online (Sandbox Code Playgroud)

如果我想同时转换为矩阵和数字,我通常使用最后一个


Gor*_*rka 11

如果您遇到以下问题:

as.numeric(as.character(dat$x))
Run Code Online (Sandbox Code Playgroud)

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

潜在的解决方案是:

as.numeric(gsub(",", ".", dat$x))
Run Code Online (Sandbox Code Playgroud)

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


Art*_*sov 8

通用方式使用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"
Run Code Online (Sandbox Code Playgroud)

  • 这是最灵活的解决方案 - 值得一些赞成! (3认同)

Aay*_*wal 6

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

因子到数字:-

data_frame$column <- as.numeric(as.character(data_frame$column))
Run Code Online (Sandbox Code Playgroud)