我正在尝试从这样的数据框中提取数值:
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
之类的许多功能,但是无法获得我想要的结果。
有人知道如何清除我的数据吗?
答案 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