如何从R中的字符串中提取数字?

ani*_*kaM 1 regex r

我有一个这样的数据框:

    > dns1
               variant_id         gene_id pval_nominal
21821  chr1_165656237_T_C_b38 ENSG00000143149  1.24119e-05
21822 chr1_165659346_C_CA_b38 ENSG00000143149  1.24119e-05
21823  chr1_165659350_A_G_b38 ENSG00000143149  1.24119e-05
21824  chr1_165659415_A_G_b38 ENSG00000143149  1.24119e-05
21825  chr1_165660430_T_C_b38 ENSG00000143149  1.24119e-05
21826  chr1_165661135_T_G_b38 ENSG00000143149  1.24119e-05
21827  chr1_165661238_C_T_b38 ENSG00000143149  1.24119e-05
...
Run Code Online (Sandbox Code Playgroud)

我想从第二列(variant_id)中删除所有字符并只提取第二个数字,如下所示:

165656237
165659346
165659350
165659415
165660430
165661135
165661238
...
Run Code Online (Sandbox Code Playgroud)

我试过这个:

dns1$variant_id <- gsub('[^0-9.]','',dns1$variant_id)
Run Code Online (Sandbox Code Playgroud)

但是使用上面的命令我得到了这个:

> dns1
      variant_id         gene_id pval_nominal
21821    116565623738 ENSG00000143149  1.24119e-05
21822    116565934638 ENSG00000143149  1.24119e-05
21823    116565935038 ENSG00000143149  1.24119e-05
21824    116565941538 ENSG00000143149  1.24119e-05
...
Run Code Online (Sandbox Code Playgroud)

所以这匹配variant_id列中的所有数字,我需要得到16565623738而不是116565623738。所以问题是如何在第二列中匹配第二个数字?

Wik*_*żew 6

您可以使用

dns1$variant_id <- sub('^[^_]*_(\\d+).*', '\\1', dns1$variant_id)
Run Code Online (Sandbox Code Playgroud)

查看正则表达式演示

细节

  • ^ - 字符串的开始
  • [^_]* - 0+ 个字符,除了 _
  • _ - 下划线
  • (\\d+) - 第 1 组:一位或多位数字
  • .* - 字符串的其余部分。

sub函数只会对每个字符串执行一次搜索和替换操作,替换中的\1反向引用会将 Group 1 中的内容放回原处。

在线 R 演示

variant_id <- c("chr1_165656237_T_C_b38", "chr1_165659346_C_CA_b38")
dns1 <- data.frame(variant_id)
dns1$variant_id <- sub('^[^_]*_(\\d+).*', '\\1', dns1$variant_id)
dns1
##=> variant_id
## 1  165656237
## 2  165659346
Run Code Online (Sandbox Code Playgroud)


Rus*_*yde 5

我相信你可以按如下方式捕捉数字:

gsub(".*?_([[:digit:]]+)_.*", "\\1", dns1$variant_id)
Run Code Online (Sandbox Code Playgroud)