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

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

由于(仍然)没有人得到复选标记,所以我认为你有一些实际的问题,主要是因为你没有指定要转换为numeric的vectortypes。 我build议你应该使用transformfunction来完成你的任务。

现在我要certificate一些“转换exception”:

 # 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" 

现在你可能会问自己: “exception在哪里?” 好吧,我已经碰到了R中很奇怪的东西,这不是最混乱的东西,但它可能会让你困惑,特别是如果你在躺在床上之前阅读这些东西。

这里是:前两列是character 。 我故意调用了第二fake_char 。 找出这个charactervariables与Dirk在他的回复中创build的variables的相似性。 它实际上是一个转换为characternumerical向量。 第三和第四列是factor ,最后一列是“纯粹”的numeric

如果使用transform函数,则可以将fake_char转换为numeric ,而不是charvariables本身。

 > 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上做同样的事情,你会很幸运,并且没有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" 

所以,结论是: 是的,你可以将character向量转换为numeric ,但只有当它的元素是“可转换”到numeric 如果vector中只有一个character元素,则在尝试将该vector转换为numerical时会出错。

而只是为了certificate我的观点:

 > 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! =)

对我有帮助的东西:如果你有variables的范围转换(或多一个),你可以使用sapply

有点荒谬,但只是例如:

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

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

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

如果x是dataframe dat的列名,而x是types因子,则使用:

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

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

只是添加user276042和pangratz

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

这将覆盖现有列x的值

蒂姆是正确的,谢恩有遗漏。 这里是另外的例子:

 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())

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

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

并将整个matrix转换为数字你有两种方法:或者:

 mode(X) <- "numeric" 

要么:

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

另外,你也可以使用data.matrix函数把所有的东西都转换成数字,但是要注意这些因素可能不能被正确地转换,所以把所有东西都转换成character是比较安全的:

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

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

如果遇到以下问题:

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

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

潜在的解决scheme是:

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

我相信这在非英语国家是相当普遍的。

尽pipe您的问题严格依赖于数字,但是在开始R时有很多难以理解的转换。我将致力于解决帮助的方法。 这个问题类似于这个问题 。

types转换可能是R中的一个痛苦,因为(1)因素不能直接转换为数字,它们需要首先转换为字符类,(2)date是一个特例,你通常需要单独处理, (3)跨dataframe列循环可能会非常棘手。 幸运的是,“逆转”解决了大部分问题。

此解决scheme使用mutate_each()将函数应用于数据框中的所有列。 在这种情况下,我们想要应用type.convert()函数,它可以将string转换为数字。 因为R喜欢因素(不知道为什么)应该保持字符的字符列被改变为因子。 为了解决这个问题,使用了mutate_if()函数来检测是因素的列,并改变为字符。 最后,我想展示如何使用lubridate将字符类中的时间戳更改为date时间,因为这对于初学者来说通常也是一个障碍。

 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_each(funs(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 

要将数据框列转换为数字,您只需要:

数字因素: –

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

虽然其他人已经涵盖了这个话题相当好,我想添加这个额外的快速思想/提示。 您可以使用正则expression式提前检查字符是否只包含数字。

 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) 

对于更复杂的正则expression式和一个干净的为什么学习/体验他们的力量看到这个非常好的网站: http : //regexr.com/

使用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" 

在我的电脑(R v.3.2.3)中, apply或者提供错误。 lapply运作良好。

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

考虑到可能存在的char列,这是基于@Abdou的Gettypes的excel表格自动回答:

 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] <- sapply(df[,numeric_cols], as.numeric) return(df) } df<-makenumcols(df) 

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

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

您必须使两列具有相同的数据,因为一列不能转换为数字。 如果你做一个转换,它会给出下面的错误

 transform(BankData, LoanApp=as.numeric(LoanApproval)) 
 Warning message: In eval(substitute(list(...)), `_data`, parent.frame()) : NAs introduced by coercion 

所以,在做了两列相同的数据后才适用

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

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