R语言 从数字、NA和字符串中提取数值

rhfm7lfc  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(226)

我有一个混合了数字、文本和NA值的列。我只想从col2中提取数字值

col1 <- c('t1', 't2', 't3', 't4', 't5', 't6', 't7', 't8', 't9', 't10')
col2 <- c(300, '>200m', NA, 'result 50 mg/g', NA, 'Not data', 'pending', NA, 'positive', 'data >20 mile/h')
df <- data.frame(col1, col2)

我的意图是:

  • 所有数字将保持为数字
  • NA值将保持NA
  • 字符/文本将转换为NA值
  • 如果是文本混合体,则提取编号(例如,'data >20 mile/h'20

预期输出(col3)如下所示:

col3 <- c(300, 200, NA, 50, NA, NA, NA, NA, NA, 20)
df2 <- data.frame(col1, col3)
ulydmbyx

ulydmbyx1#

使用str_extractstringr中提取数字。

library(stringr)

cbind(df, col3 = as.numeric(str_extract(df$col2, "[\\d+.]+")))
   col1            col2  col3
1    t1             300 300.0
2    t2           >200m 200.0
3    t3      wef3.2 wef   3.2
4    t4  result 50 mg/g  50.0
5    t5            <NA>    NA
6    t6        Not data    NA
7    t7         pending    NA
8    t8            <NA>    NA
9    t9        positive    NA
10  t10 data >20 mile/h  20.0

使用gsub,删除除数字以外的所有内容。

cbind(df, col3 = as.numeric(
  gsub("([.-])|[[:alpha:][:punct:] ]", "\\1", df$col2)))
   col1            col2  col3
1    t1             300 300.0
2    t2           >200m 200.0
3    t3      wef3.2 wef   3.2
4    t4  result 50 mg/g  50.0
5    t5            <NA>    NA
6    t6        Not data    NA
7    t7         pending    NA
8    t8            <NA>    NA
9    t9        positive    NA
10  t10 data >20 mile/h  20.0

或者使用\\D(非数字)代替[:alpha:][:punct:](感谢@thelatemail和@onyambu)!

数据
df <- structure(list(col1 = c("t1", "t2", "t3", "t4", "t5", "t6", "t7", 
"t8", "t9", "t10"), col2 = c("300", ">200m", "wef3.2 wef", "result 50 mg/g", 
NA, "Not data", "pending", NA, "positive", "data >20 mile/h")), 
row.names = c(NA, -10L), class = "data.frame")
xoefb8l8

xoefb8l82#

一个可能的选项是使用readr package中的parse_number(),例如

library(readr)
col1 <- c('t1', 't2', 't3', 't4', 't5', 't6', 't7', 't8', 't9', 't10')
col2 <- c(300, '>200m', NA, 'result 50 mg/g', NA, 'Not data', 'pending', NA, 'positive', 'data >20 mile/h')
df <- data.frame(col1, col2)

df$col3 <- parse_number(df$col2)
#> Warning: 3 parsing failures.
#> row col expected   actual
#>   6  -- a number Not data
#>   7  -- a number pending 
#>   9  -- a number positive
df
#>    col1            col2 col3
#> 1    t1             300  300
#> 2    t2           >200m  200
#> 3    t3            <NA>   NA
#> 4    t4  result 50 mg/g   50
#> 5    t5            <NA>   NA
#> 6    t6        Not data   NA
#> 7    t7         pending   NA
#> 8    t8            <NA>   NA
#> 9    t9        positive   NA
#> 10  t10 data >20 mile/h   20

创建于2023年2月7日,使用reprex v2.0.2

相关问题