从 R 中的混合变量列中提取数值
Extracting numeric values from mixed variable column in R
对 R 和一般编码非常陌生,所以遇到了一些严重的问题!
我有一个包含来自 GWAS 的 1,887,181 个条目的数据框。我正在尝试使用 qqman 包来创建曼哈顿图。我遇到的问题是创建 BP 列所需的数据以混合字符串格式给出,其中染色体编号在 ID 列中。对于顶部相关的 SNP(其中只有 45 个条目),我一直在使用 as.numeric_version() 以便从 ID 列中提取数字部分,这有效但绝对是一种不正确的方法,因为它给出了以下错误,但仍然输出正确的值:
BP<-as.numeric_version(PDLS_top_mp$CHR)
Error: invalid version specification ‘2R_19509740_SNP’,
‘2R_19509741_SNP’, ‘2R_15116838_SNP’, ‘3R_10159602_SNP’,
‘2L_2855787_INS’, ‘X_11169099_SNP’, ‘2L_2855805_SNP’,
‘3R_19567990_SNP’, ‘2R_19751690_SNP’, ‘2L_17155446_INS’,
‘3R_4610617_SNP’, ‘3L_1114964_SNP’, ‘2L_17155370_SNP’,
‘3L_3548725_SNP’, ‘2R_16873693_SNP’, ‘2R_15527873_SNP’,
‘3L_3548727_SNP’, ‘2L_2855816_SNP’, ‘3R_19576606_SNP’,
‘3L_11508729_DEL’, ‘2L_17155422_SNP’, ‘3R_22503130_INS’,
‘3R_4610630_SNP’, ‘2R_12331096_SNP’, ‘3R_8777795_SNP’,
‘3L_10615500_SNP’, ‘X_17577589_SNP’, ‘X_17577622_SNP’,
‘2L_7047925_SNP’, ‘2L_7047917_SNP’, ‘3R_9564478_SNP’, ‘3R_9590636_SNP’,
‘3R_3614137_SNP’, ‘2R_4682340_INS’, ‘3L_6056407_SNP’,
‘3L_11503648_SNP’, ‘3R_9580772_SNP’, ‘2L_18252469_SNP’,
‘2L_7047939_SNP’, ‘3R_25530801_DEL’, ‘3L_1111454_SNP’,
‘2L_17324557_SNP’, ‘3L_9799858_SNP�
我尝试设置正则表达式并使用以下内容替换值,但也不起作用:
regexp<-"_[[:digit:]]_+"
s<-str_extract(PDLS_top_mp$ID,regexp)
View(s)
Error in View : 'names' attribute [2] must be the same length as the vector [1]
as.numeric_version() 不适用于包含所有相关 SNP 的非常大的数据框,它只是 returns 每个条目的 NA。这是所有关联的 SNP 数据框的样子:
print(head(PDLS_ALL_dtf))
# A tibble: 6 × 3
ID SinglePval SingleMixedPval
<chr> <dbl> <dbl>
2L_5372_SNP 0.6712 7.328082
2L_5390_SNP 0.8176 8.459388
2L_5403_SNP 0.9967 8.304397
2L_5465_SNP 0.7897 6.187142
2L_5516_SNP 0.4967 5.223919
2L_5598_SNP 0.7099 5.169412
我希望它以这样的方式结束:(其中有 5 个不同的染色体 ID,X、2L、2R、3L、3R 和 4 均采用上述格式)
ID BP SinglePval SingleMixedPval
<chr> <num> <dbl> <dbl>
1 2L 5372 0.6712 7.328082
2 2L 5390 0.8176 8.459388
3 2L 5403 0.9967 8.304397
4 2L 5465 0.7897 6.187142
5 2L 5516 0.4967 5.223919
6 2L 5598 0.7099 5.169412
任何帮助将不胜感激!
strsplit
就是为了这个目的而制作的
ID = sapply(strsplit(PDLS_ALL_dtf$ID, "_"), function(x) x[[1]])
ID
[1] "2L" "2L" "2L" "2L" "2L" "2L"
BP = sapply(strsplit(PDLS_ALL_dtf$ID, "_"), function(x) x[[2]])
BP
[1] "5372" "5390" "5403" "5465" "5516" "5598"
将它们放在一个数据框中:
PDLS_ALL_dtf$BP = sapply(strsplit(PDLS_ALL_dtf$ID, "_"), function(x) x[[2]])
PDLS_ALL_dtf$ID = sapply(strsplit(PDLS_ALL_dtf$ID, "_"), function(x) x[[1]])
PDLS_ALL_dtf = PDLS_ALL_dtf[,c(1,4,2,3)]
PDLS_ALL_dtf
ID BP SinglePval SingleMixedPval
1 2L 5372 0.6712 7.328082
2 2L 5390 0.8176 8.459388
3 2L 5403 0.9967 8.304397
4 2L 5465 0.7897 6.187142
5 2L 5516 0.4967 5.223919
6 2L 5598 0.7099 5.169412
可以使用 dplyr/tidyr:
df_new<-df%>%separate(ID,into=c("ID","BP"),sep="_")
注意:因为第二个下划线(_SNP),所以会有警告。但我猜在这种情况下这并不重要。
Warning message:
Too many values at 7 locations: 1, 2, 3, 4, 5, 6, 7
如果您想保留它:
df_new<-df%>%separate(ID,into=c("ID","BP"),extra="merge")
或放弃它:
df_new<-df%>%separate(ID,into=c("ID","BP"),extra="drop")
df_new
ID BP SinglePval SingleMixedPval
1 2L 5372 0.6712 7.328082
2 2L 5390 0.8176 8.459388
3 2L 5403 0.9967 8.304397
4 2L 5465 0.7897 6.187142
5 2L 5516 0.4967 5.223919
6 2L 5598 0.7099 5.169412
7 2L 5598 0.7099 5.169412
这是一个使用extract
的选项
library(tidyverse)
PDLS_ALL_dtf %>%
extract(ID, into = c("ID", "BP"), "^([^_]+)_([^_]+).*")
# ID BP SinglePval SingleMixedPval
#1 2L 5372 0.6712 7.328082
#2 2L 5390 0.8176 8.459388
#3 2L 5403 0.9967 8.304397
#4 2L 5465 0.7897 6.187142
#5 2L 5516 0.4967 5.223919
#6 2L 5598 0.7099 5.169412
对 R 和一般编码非常陌生,所以遇到了一些严重的问题! 我有一个包含来自 GWAS 的 1,887,181 个条目的数据框。我正在尝试使用 qqman 包来创建曼哈顿图。我遇到的问题是创建 BP 列所需的数据以混合字符串格式给出,其中染色体编号在 ID 列中。对于顶部相关的 SNP(其中只有 45 个条目),我一直在使用 as.numeric_version() 以便从 ID 列中提取数字部分,这有效但绝对是一种不正确的方法,因为它给出了以下错误,但仍然输出正确的值:
BP<-as.numeric_version(PDLS_top_mp$CHR)
Error: invalid version specification ‘2R_19509740_SNP’,
‘2R_19509741_SNP’, ‘2R_15116838_SNP’, ‘3R_10159602_SNP’,
‘2L_2855787_INS’, ‘X_11169099_SNP’, ‘2L_2855805_SNP’,
‘3R_19567990_SNP’, ‘2R_19751690_SNP’, ‘2L_17155446_INS’,
‘3R_4610617_SNP’, ‘3L_1114964_SNP’, ‘2L_17155370_SNP’,
‘3L_3548725_SNP’, ‘2R_16873693_SNP’, ‘2R_15527873_SNP’,
‘3L_3548727_SNP’, ‘2L_2855816_SNP’, ‘3R_19576606_SNP’,
‘3L_11508729_DEL’, ‘2L_17155422_SNP’, ‘3R_22503130_INS’,
‘3R_4610630_SNP’, ‘2R_12331096_SNP’, ‘3R_8777795_SNP’,
‘3L_10615500_SNP’, ‘X_17577589_SNP’, ‘X_17577622_SNP’,
‘2L_7047925_SNP’, ‘2L_7047917_SNP’, ‘3R_9564478_SNP’, ‘3R_9590636_SNP’,
‘3R_3614137_SNP’, ‘2R_4682340_INS’, ‘3L_6056407_SNP’,
‘3L_11503648_SNP’, ‘3R_9580772_SNP’, ‘2L_18252469_SNP’,
‘2L_7047939_SNP’, ‘3R_25530801_DEL’, ‘3L_1111454_SNP’,
‘2L_17324557_SNP’, ‘3L_9799858_SNP�
我尝试设置正则表达式并使用以下内容替换值,但也不起作用:
regexp<-"_[[:digit:]]_+"
s<-str_extract(PDLS_top_mp$ID,regexp)
View(s)
Error in View : 'names' attribute [2] must be the same length as the vector [1]
as.numeric_version() 不适用于包含所有相关 SNP 的非常大的数据框,它只是 returns 每个条目的 NA。这是所有关联的 SNP 数据框的样子:
print(head(PDLS_ALL_dtf))
# A tibble: 6 × 3
ID SinglePval SingleMixedPval
<chr> <dbl> <dbl>
2L_5372_SNP 0.6712 7.328082
2L_5390_SNP 0.8176 8.459388
2L_5403_SNP 0.9967 8.304397
2L_5465_SNP 0.7897 6.187142
2L_5516_SNP 0.4967 5.223919
2L_5598_SNP 0.7099 5.169412
我希望它以这样的方式结束:(其中有 5 个不同的染色体 ID,X、2L、2R、3L、3R 和 4 均采用上述格式)
ID BP SinglePval SingleMixedPval
<chr> <num> <dbl> <dbl>
1 2L 5372 0.6712 7.328082
2 2L 5390 0.8176 8.459388
3 2L 5403 0.9967 8.304397
4 2L 5465 0.7897 6.187142
5 2L 5516 0.4967 5.223919
6 2L 5598 0.7099 5.169412
任何帮助将不胜感激!
strsplit
就是为了这个目的而制作的
ID = sapply(strsplit(PDLS_ALL_dtf$ID, "_"), function(x) x[[1]])
ID
[1] "2L" "2L" "2L" "2L" "2L" "2L"
BP = sapply(strsplit(PDLS_ALL_dtf$ID, "_"), function(x) x[[2]])
BP
[1] "5372" "5390" "5403" "5465" "5516" "5598"
将它们放在一个数据框中:
PDLS_ALL_dtf$BP = sapply(strsplit(PDLS_ALL_dtf$ID, "_"), function(x) x[[2]])
PDLS_ALL_dtf$ID = sapply(strsplit(PDLS_ALL_dtf$ID, "_"), function(x) x[[1]])
PDLS_ALL_dtf = PDLS_ALL_dtf[,c(1,4,2,3)]
PDLS_ALL_dtf
ID BP SinglePval SingleMixedPval
1 2L 5372 0.6712 7.328082
2 2L 5390 0.8176 8.459388
3 2L 5403 0.9967 8.304397
4 2L 5465 0.7897 6.187142
5 2L 5516 0.4967 5.223919
6 2L 5598 0.7099 5.169412
可以使用 dplyr/tidyr:
df_new<-df%>%separate(ID,into=c("ID","BP"),sep="_")
注意:因为第二个下划线(_SNP),所以会有警告。但我猜在这种情况下这并不重要。
Warning message:
Too many values at 7 locations: 1, 2, 3, 4, 5, 6, 7
如果您想保留它:
df_new<-df%>%separate(ID,into=c("ID","BP"),extra="merge")
或放弃它:
df_new<-df%>%separate(ID,into=c("ID","BP"),extra="drop")
df_new
ID BP SinglePval SingleMixedPval
1 2L 5372 0.6712 7.328082
2 2L 5390 0.8176 8.459388
3 2L 5403 0.9967 8.304397
4 2L 5465 0.7897 6.187142
5 2L 5516 0.4967 5.223919
6 2L 5598 0.7099 5.169412
7 2L 5598 0.7099 5.169412
这是一个使用extract
library(tidyverse)
PDLS_ALL_dtf %>%
extract(ID, into = c("ID", "BP"), "^([^_]+)_([^_]+).*")
# ID BP SinglePval SingleMixedPval
#1 2L 5372 0.6712 7.328082
#2 2L 5390 0.8176 8.459388
#3 2L 5403 0.9967 8.304397
#4 2L 5465 0.7897 6.187142
#5 2L 5516 0.4967 5.223919
#6 2L 5598 0.7099 5.169412