在r中将多个列从字符转换为数字格式

时间:2014-03-31 21:11:53

标签: r function formatting

将数据框中的多个列从字符转换为数字格式的最有效方法是什么?

我有一个名为DF的数据框,包含所有字符变量。

我想做点什么

for (i in names(DF){
    DF$i <- as.numeric(DF$i)
}

谢谢

14 个答案:

答案 0 :(得分:33)

你可以尝试

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"

答案 1 :(得分:7)

如果您已经使用了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。它还检查它是否是一个忽略因子的字符向量。它还会抑制警告,因为您知道将会故意引入NA并稍后进行检查。

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

答案 2 :(得分:4)

您可以使用列索引: data_set[,1:9] <- sapply(dataset[,1:9],as.character)

答案 3 :(得分:2)

我想我明白了。这就是我所做的(也许不是最优雅的解决方案 - 关于如何实现这一点的建议非常受欢迎)

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

答案 4 :(得分:2)

我意识到这是一个旧线程,但想发布一个类似于你的函数请求的解决方案(我试图将整个表格格式化为百分比标签时遇到了类似的问题)。

假设您有一个要转换的包含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])
          }
  }

这对于大型表来说并不理想,因为它逐个单元格,但它可以完成工作。

答案 5 :(得分:1)

您可以使用hablar软件包中的convert:

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   

答案 6 :(得分:1)

使用 dplyr 1.0 中的 cross() 函数

   df <- df %>% mutate(across(, ~as.numeric(.))

答案 7 :(得分:0)

这个来自ARobertson的例子是我在这里看到的最有效的例子。我用它来将整数转换为数字。就像我需要它一样工作,不需要循环或很长的代码。

library(dplyr)
library(magrittr)

解决方案

dataset %<>% mutate_if(is.integer,as.numeric)

答案 8 :(得分:0)

像这样吗?

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回答。

答案 9 :(得分:0)

对对我有用的ARobertson和Kenneth Wilson的答案进行了些微调整。

运行R 3.6.0,在我的环境中具有library(tidyverse)和library(dplyr):

library(tidyverse)
library(dplyr)
> df %<>% mutate_if(is.character, as.numeric)
Error in df %<>% mutate_if(is.character, as.numeric) : 
  could not find function "%<>%"

我进行了一些快速研究,并在Hadley的“ The tidyverse style guide”中找到了此笔记。

  

magrittr软件包提供了%<>%运算符,作为在适当位置修改对象的快捷方式。避免使用此运算符。

# Good x <- x %>%
           abs() %>%    
           sort()

# Bad x %<>%   
          abs() %>%
          sort()

解决方案

基于该样式指南:

df_clean <- df %>% mutate_if(is.character, as.numeric)

工作示例

> df_clean <- df %>% mutate_if(is.character, as.numeric)
Warning messages:
1: NAs introduced by coercion 
2: NAs introduced by coercion 
3: NAs introduced by coercion 
4: NAs introduced by coercion 
5: NAs introduced by coercion 
6: NAs introduced by coercion 
7: NAs introduced by coercion 
8: NAs introduced by coercion 
9: NAs introduced by coercion 
10: NAs introduced by coercion 
> df_clean
# A tibble: 3,599 x 17
   stack datetime            volume BQT90 DBT90 DRT90 DLT90 FBT90  RT90 HTML90 RFT90 RLPP90 RAT90 SRVR90 SSL90 TCP90 group
   <dbl> <dttm>               <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl>  <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>

答案 10 :(得分:0)

type.convert()

根据需要将数据对象转换为逻辑,整数,数字,复数,字符或因子。

See.

答案 11 :(得分:0)

我使用此代码将除第一个列之外的所有列都转换为数字:

    library(dplyr)
    # check structure, row and column number with: glimpse(df)
    # convert to numeric e.g. from 2nd column to 10th column
    df <- df %>% 
     mutate_at(c(2:10), as.numeric)

答案 12 :(得分:0)

for (i in 1:names(DF){
    DF[[i]] <- as.numeric(DF[[i]])
}

我用双括号 [[]] 解决了这个问题

答案 13 :(得分:0)

A<- read.csv("Environment_Temperature_change_E_All_Data_NOFLAG.csv",header = F)

现在,转换为字符

A<- type.convert(A,as.is=T)

将某些列从字符转换为数字

A[,c(1,3,5,c(8:66))]<- as.numeric(as.character(unlist(A[,c(1,3,5,c(8:66))])))