如何从R中的列提取数值

n9vozmp4  于 2023-03-15  发布在  其他
关注(0)|答案(3)|浏览(157)

我只需要从一个混合类的列中提取数值。下面是一个示例数据集:

df <- data.frame(id = c(1,2,3,4,5,6,7,8,9,10),
                 score = c("1","0","1+AB","0,B","1,1","A","B","1,A","1","0,A+B,C"))

> df
   id   score
1   1       1
2   2       0
3   3    1+AB
4   4     0,B
5   5     1,1
6   6       A
7   7       B
8   8     1,A
9   9       1
10 10 0,A+B,C

score列中,我只需要数值,如果该值没有数值,则重新编码的值应为0,同样,如果数值重复为1,1,则只重新编码1
我怎样才能得到下面所需的输出。

> df
   id   score recoded_score
1   1       1   1
2   2       0   0
3   3    1+AB   1
4   4     0,B   0
5   5     1,1   1
6   6       A   0
7   7       B   0
8   8     1,A   1
9   9       1   1
10 10 0,A+B,C   0
qpgpyjmq

qpgpyjmq1#

使用str_extract提取数字部分,然后使用coalesce提取0

library(dplyr)
library(stringr)
df %>% 
   mutate(recoded_score = coalesce(as.numeric(str_extract(score, "\\d+")), 0))
  • 输出
id   score recoded_score
1   1       1             1
2   2       0             0
3   3    1+AB             1
4   4     0,B             0
5   5     1,1             1
6   6       A             0
7   7       B             0
8   8     1,A             1
9   9       1             1
10 10 0,A+B,C             0
k2fxgqgv

k2fxgqgv2#

我们可以从readr中使用parse_number来提取每个字符串的第一个数字,有趣的是,并不分隔数字,所以要将其用于1,1,我们必须将,修改为;

library(dplyr)
library(readr)
library(stringr)

df %>% 
  mutate(score = str_replace(score, ",", ";"),
         recoded_score = parse_number(score),
         recoded_score = ifelse(is.na(recoded_score), score, recoded_score))
id score   recoded_score
   <dbl> <chr>   <chr>        
 1     1 1       1            
 2     2 0       0            
 3     3 1+AB    1            
 4     4 0;B     0            
 5     5 1;1     1            
 6     6 A       A            
 7     7 B       B            
 8     8 1;A     1            
 9     9 1       1            
10    10 0;A+B,C 0
vnzz0bqm

vnzz0bqm3#

使用sub基R方法

repl <- as.numeric(sub("\\D+.*", "", df$score))

df$recoded_score <- ifelse(is.na(repl), 0, repl)

df
   id   score recoded_score
1   1       1             1
2   2       0             0
3   3    1+AB             1
4   4     0,B             0
5   5     1,1             1
6   6       A             0
7   7       B             0
8   8     1,A             1
9   9       1             1
10 10 0,A+B,C             0

相关问题