在r中将多个列从字符转换为数字格式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在r中将多个列从字符转换为数字格式相关的知识,希望对你有一定的参考价值。
将数据框中的多个列从字符转换为数字格式的最有效方法是什么?
我有一个名为DF的数据框,包含所有字符变量。
我想做点什么
for (i in names(DF){
DF$i <- as.numeric(DF$i)
}
谢谢
你可以试试
DF <- data.frame("a" = as.character(0:5),
"b" = paste(0:5, ".1", sep = ""),
"c" = letters[1:6],
stringsAsFactors = FALSE)
# Check columns classes
sapply(DF, class)
# a b c
# "character" "character" "character"
cols.num <- c("a","b")
DF[cols.num] <- sapply(DF[cols.num],as.numeric)
sapply(DF, class)
# a b c
# "numeric" "numeric" "character"
如果您已经使用了tidyverse,根据具体情况,有一些解决方案:
library(dplyr)
library(magrittr)
# solution
dataset %<>% mutate_if(is.character,as.numeric)
# to test
df <- data.frame(
x1 = c('1','2','3'),
x2 = c('4','5','6'),
x3 = c('1','a','b'), # vector with alpha characters
stringsAsFactors = F)
# display starting structure
df %>% str()
将所有字符向量转换为数字(如果不是数字,可能会失败)
df %>%
select(-x3) %>% # this removes the alpha column if all your character columns need converted to numeric
mutate_if(is.character,as.numeric) %>%
str()
检查是否可以转换每列。这可以是匿名函数。它检查as.numeric是否返回NA。它还检查它是否是一个忽略因子的字符向量。它还会抑制警告,因为您知道将会故意引入NAs并在以后检查。
numericcharacters <- function(x) {
!any(is.na(suppressWarnings(as.numeric(x)))) & is.character(x)
}
df %>%
mutate_if(numericcharacters,as.numeric) %>%
str()
如果要转换特定的命名列,则mutate_at更好。
df %>% mutate_at('x1',as.numeric) %>% str()
您可以使用列索引:data_set[,1:9] <- sapply(dataset[,1:9],as.character)
我想我明白了。这就是我所做的(也许不是最优雅的解决方案 - 关于如何实现这一点的建议非常受欢迎)
#names of columns in data frame
cols <- names(DF)
# character variables
cols.char <- c("fx_code","date")
#numeric variables
cols.num <- cols[!cols %in% cols.char]
DF.char <- DF[cols.char]
DF.num <- as.data.frame(lapply(DF[cols.num],as.numeric))
DF2 <- cbind(DF.char, DF.num)
我意识到这是一个旧线程,但想发布一个类似于你的函数请求的解决方案(只是遇到了类似的问题,我试图将整个表格格式化为百分比标签)。
假设您有一个要转换的包含5个字符列的df。首先,我创建一个包含我想要操作的列名称的表:
col_to_convert <- data.frame(nrow = 1:5
,col = c("col1","col2","col3","col4","col5"))
for (i in 1:max(cal_to_convert$row))
{
colname <- col_to_convert$col[i]
colnum <- which(colnames(df) == colname)
for (j in 1:nrow(df))
{
df[j,colnum] <- as.numericdf(df[j,colnum])
}
}
这对于大型表来说并不理想,因为它逐个单元格,但它可以完成工作。
你可以使用来自hablar包的转换:
library(dplyr)
library(hablar)
# Sample df (stolen from the solution by Luca Braglia)
df <- tibble("a" = as.character(0:5),
"b" = paste(0:5, ".1", sep = ""),
"c" = letters[1:6])
# insert variable names in num()
df %>% convert(num(a, b))
哪个给你:
# A tibble: 6 x 3
a b c
<dbl> <dbl> <chr>
1 0. 0.100 a
2 1. 1.10 b
3 2. 2.10 c
4 3. 3.10 d
5 4. 4.10 e
6 5. 5.10 f
或者如果你很懒,让hablar的retype()猜测正确的数据类型:
df %>% retype()
这给你:
# A tibble: 6 x 3
a b c
<int> <dbl> <chr>
1 0 0.100 a
2 1 1.10 b
3 2 2.10 c
4 3 3.10 d
5 4 4.10 e
6 5 5.10 f
来自ARobertson的这个例子是我在这里看到的最有效的。我用它将整数转换为数字。工作就像我需要它,不需要循环或长代码。
library(dplyr)
library(magrittr)
solution
dataset %<>% mutate_if(is.integer,as.numeric)
像这样?
DF <- data.frame("a" = as.character(0:5),
"b" = paste(0:5, ".1", sep = ""),
"c" = paste(10:15),
stringsAsFactors = FALSE)
DF <- apply(DF, 2, as.numeric)
如果数据框中有“真实”字符,如'a''b''c',我建议从davsjob回答。
以上是关于在r中将多个列从字符转换为数字格式的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PySpark 1.6 中将 DataFrame 列从字符串转换为浮点/双精度?
dbReadTable 将日期列从 SQL 数据库强制转换为字符