2017-02-16 17 views
0

Rに非常に新しく、一般的にコーディングするので、いくつかの深刻な問題があります。 私は、GWASからの1,887,181のエントリを含むデータフレームを持っています。私はマンハッタンプロットを作成するためにqqmanパッケージを使用しようとしています。私が抱えている問題は、BP列を作成するために必要なデータが、ID列の染色体番号を含む混合文字列形式で与えられていることです。 (そのうちの45のエントリーしかない)関連するSNPのうち、私はas.numeric_version()を使ってIDの列から数字部分を抽出していますが、間違った方法である次のエラーを与えるが、それでも正しい値を出力しますRの混合変数列から数値を抽出する

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] 

ザ・方法:

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� 

私は正規表現を設定しても動作しませんでした、次を使用して値を交換しようとしました。関連するすべてのSNPを含む非常に大きなデータフレームに対してnumeric_version()は機能しません。すべてのエントリに対してNAを返します。 (5つの異なる染色体のID、X、2Lが存在する場合、2R、3L、3R及び4のすべてで:

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 

私はそれがこのように終わるしたいと思います。ここでは、関連するすべてのSNPデータフレームは次のようになります。上記フォーマット)

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 

ご迷惑をおかけして申し訳ございません。

答えて

1

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 
1

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" 

は、1つのデータフレームで一緒にそれをすべて置くために、この目的のためだけで構成されています

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 
1

を使用することができdplyr/tidyr:

df_new<-df%>%separate(ID,into=c("ID","BP"),sep="_") 

注: 2番目のアンダースコア(_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 
+0

多くのおかげで、正確に何を使用してオプションです。私は探していた! –

関連する問題