从R的数据框中的单元格中提取数字字符

时间:2018-08-17 12:06:14

标签: r extract data-science data-cleaning

我正在尝试从这样的数据框中提取数值:

ID Secc                     col1      col2        col3
 1 Sección 0805601006       1400      1300        85*      
 2 Sección 0805601007       1475      1365        5.0     
 3 Sección 0805601005       760       760         0.0      
 4 Sección 0805601003       1335      1335        0.0      
 5 Sección 0805601002       655       655         0.0      
 6 Sección 0805601004       900       815         85* 

要仅获得带有以下数字字符的“干净”数据框:

    ID Secc             col1      col2       col3
     1 0805601006       1400      1300       85      
     2 0805601007       1475      1365       5.0     
     3 0805601005       760       760        0.0      
     4 0805601003       1335      1335       0.0      
     5 0805601002       655       655        0.0      
     6 0805601004       900       815        85

我一直在尝试诸如extract_numeric, st_replace, gsub之类的许多功能,但是无法获得我想要的结果。

有人知道如何清除我的数据吗?

2 个答案:

答案 0 :(得分:7)

您可以使用readr::parse_number

library(readr)
df1[] <- lapply(df1, parse_number)
df1
#   ID     Secc col1 col2 col3
# 1  1 8.06e+08 1400 1300   85
# 2  2 8.06e+08 1475 1365    5
# 3  3 8.06e+08  760  760    0
# 4  4 8.06e+08 1335 1335    0
# 5  5 8.06e+08  655  655    0
# 6  6 8.06e+08  900  815   85

sapply(df1,class)
#        ID      Secc      col1      col2      col3 
# "numeric" "numeric" "numeric" "numeric" "numeric"

在整洁的说话中,使用df1 %>% mutate_all(parse_number)

这是使用基数R(相同输出)的一种方式:

df1[] <-lapply(df1, function(x) as.numeric(gsub("(?![\\.-])\\D","",x, perl=T)))

注意:tidyr::extract_numeric也可以使用,但是不推荐使用readr::parse_number

数据

df1 <- read.table(text="ID Secc                     col1      col2        col3
1 'Sección 0805601006'       1400      1300        85*      
2 'Sección 0805601007'       1475      1365        5.0     
3 'Sección 0805601005'       760       760         0.0      
4 'Sección 0805601003'       1335      1335        0.0      
5 'Sección 0805601002'       655       655         0.0      
6 'Sección 0805601004'       900       815         85*",h=T,strin=F) 

答案 1 :(得分:2)

让我们考虑一个更通用的方法。数字可以为负(-)。

我对数据做了一点改动。

    df1 <- read.table(text="ID Secc                     col1      col2        col3
1 'Sección 0805601006'       1400      1300        85*      
                  2 'Sección 0805601007'       -14rofl75      1365        5.0     
                  3 'Sección 0805601005'       760       760         0.0      
                  4 'Sección 0805601003'       1-3-3-5      1335        0.0      
                  5 'Sección 0805601002'       -655       HEHE-655         0.0      
                  6 'Sección 0805601004'       900       815         85*",h=T,strin=F) 

代码:

fun1 <- function(x) {
    ge<-gregexpr("(^-?|(?<=\\D)-)?(\\d\\.?\\d*?)+",x,perl=T)
    return(as.numeric(sapply(regmatches(x,ge),paste0,collapse="")))
    }
df1[] <- lapply(df1,fun1)

结果:

#  ID       Secc  col1 col2 col3
#1  1 0805601006  1400 1300   85
#2  2 0805601007 -1475 1365    5
#3  3 0805601005   760  760    0
#4  4 0805601003  1335 1335    0
#5  5 0805601002  -655 -655    0
#6  6 0805601004   900  815   85