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

如何从R中的字符串中提取数字?,r,regex,R,Regex,我有这样一个数据帧: > 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.241

我有这样一个数据帧:

    > 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
...
165656237
165659346
165659350
165659415
165660430
165661135
165661238
...
我想删除第二列variant_id中的所有字符,并仅提取第二个数字,如下所示:

    > 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
...
165656237
165659346
165659350
165659415
165660430
165661135
165661238
...
我试过这个:

dns1$variant_id <- gsub('[^0-9.]','',dns1$variant_id)

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

这是一个超级黑客解决方案,它使用了来自stringr的gsub和STRU替换。我相信有更好的解决方案,这要求variant_id总是从chr1_开始,这可能不公平

dns1$variant_id <- gsub('_(.*)','', str_replace(dns1$variant_id, 'chr1_',''))

这是一个超级黑客解决方案,它使用了来自stringr的gsub和str_替换。我相信有更好的解决方案,这要求variant_id总是从chr1_开始,这可能不公平

dns1$variant_id <- gsub('_(.*)','', str_replace(dns1$variant_id, 'chr1_',''))
你可以用

dns1$variant_id <- sub('^[^_]*_(\\d+).*', '\\1', dns1$variant_id)
你可以用

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

我相信您可以捕捉以下数字:

gsub(".*?_([[:digit:]]+)_.*", "\\1", dns1$variant_id)

我相信您可以捕捉以下数字:

gsub(".*?_([[:digit:]]+)_.*", "\\1", dns1$variant_id)
下面是一个使用stringr的选项:

图书馆长 df 1 chr1_165656237_T_C_b38 165656237 >2 chr1_165659346_C_CA_b38 165659346 >3 chr1_165659350_A_G_b38 165659350 >4 chr1_165659415_A_G_b38 165659415 >5 chr1_165660430_T_C_b38 165660430 >6 chr1_165661135_T_G_b38 165661135 >7 chr1_165661238_C_T_b38 165661238 下面是一个使用stringr的选项:

图书馆长 df 1 chr1_165656237_T_C_b38 165656237 >2 chr1_165659346_C_CA_b38 165659346 >3 chr1_165659350_A_G_b38 165659350 >4 chr1_165659415_A_G_b38 165659415 >5 chr1_165660430_T_C_b38 165660430 >6 chr1_165661135_T_G_b38 165661135 >7 chr1_165661238_C_T_b38 165661238 你可以用

dns$variant_id_new <- sapply(strsplit(as.character(dns$variant_id), "_"), unlist)[2,]
从逻辑上讲,这首先将变量_id中的所有字符串按id进行拆分。sapply,unlist将其转换为一个矩阵,我们将第二行作为第二个变量

您可以使用

dns$variant_id_new <- sapply(strsplit(as.character(dns$variant_id), "_"), unlist)[2,]
从逻辑上讲,这首先将变量_id中的所有字符串按id进行拆分。sapply,unlist将其转换为一个矩阵,我们将第二行作为第二个变量

当我运行gsub“uu.*”,“chr1\u 165656237\u T\u C\u b38”时,我得到chr1。这不是您想要的,但我不会得到您报告的结果。请确保您共享数据的dput,或者我们可以复制/粘贴到R中的其他内容。准确了解数据中的内容及其存储方式非常重要。此外,确保这是可复制的。我在运行代码时也会得到一些不同的东西。一定有什么你遗漏了。当我运行gsub时,我得到了chr1。这不是您想要的,但我不会得到您报告的结果。请确保您共享数据的dput,或者我们可以复制/粘贴到R中的其他内容。准确了解数据中的内容及其存储方式非常重要。此外,确保这是可复制的。我在运行代码时也会得到一些不同的东西。你一定漏掉了什么。