2016-11-17 4 views
0

Iは、次の通常の混合モデルとビン観察から1,000,000観察をサンプリング セットアップ10,000ビンのそれぞれは、観察の同数(即ち100)を有するようにします。これは、(a,b]の形式で各ビンの要因を作成します。ここで、abは数字です。因子変数をある間隔からエンドポイントを取得

#Random sample 
set.seed(1234) 
X = ks::rnorm.mixt(n=1000000,mus=c(0.2,0.8),sigmas=c(0.04,0.01),props=c(0.95,0.05)) 

#Bins based on random sample with ~100 observations in each bins 
bins = ggplot2::cut_number(X,10000) 

dat = data.frame(X,bins) 

質問 私が要因(a,b]から数字abを抽出したいと思います。ここではビンがどのように見えるかです:

> head(table(bins)) 
bins 
[0.00501617,0.0518875] (0.0518875,0.0594831] (0.0594831,0.0640679] 
        100     100     100 
(0.0640679,0.0670062] (0.0670062,0.0694194] (0.0694194,0.0717924] 
        100     100     100 
> tail(table(bins),20) 
bins 
(0.817766,0.818032] (0.818032,0.8183] (0.8183,0.818544] (0.818544,0.818879] 
       100     100     100     100 
(0.818879,0.819112] (0.819112,0.819394] (0.819394,0.819664] (0.819664,0.819979] 
       100     100     100     100 
(0.819979,0.820328] (0.820328,0.820727] (0.820727,0.821118] (0.821118,0.82158] 
       100     100     100     100 
(0.82158,0.822109] (0.822109,0.822646] (0.822646,0.823253] (0.823253,0.82408] 
       100     100     100     100 
(0.82408,0.825026] (0.825026,0.826417] (0.826417,0.828651] (0.828651,0.84424] 
       100     100     100     100 

あなたが見ることができるように、要因の数字は常に同じ桁数を持っていないと、彼らが0の(例えば(0.0518875,0.0594831])が先行することができます。

Iが最初に上記のビン((0.0518875,0.0594831])について

endpts=na.omit(as.numeric(unlist(strsplit(as.character(unlist(bins)),"[^0-9]+")))) 

を用いだけ数字部分を抽出しようとした後続のゼロがなくなっているため、この手順は、出力 518875 594831、しかし、それは、いくつかにマッピングすることができるであろう値(例:0.518875 0.594831)。さらに、数字の一方または両方が異なる桁数(例えば、(0.818032,0.8183])を有するビンがある。出力の均一性の欠如は、エンドポイントを取得しようとすると問題が発生します。最終的には、左右のエンドポイントを取得したいと考えています。助言がありますか?

編集また、cut機能を使用するggplot2::cut_numberのコードを調べました。数字の桁数のデフォルト入力cutdig.lab=3ですが、これは上記の出力に反映されていないようです。

+0

小数点を保存すると、コードが成功する可能性が高くなります。 –

答えて

2

何か。この最初の(1)は、文字クラスパターンを使用して隣接する「(」、「[」および「])を削除し、次にコンマで分割し、(3)リスト構造をunlistで「ベクトル化」し、 。数値とは、最終的には(5)重複を削除するには、この書式のために改行を使用して、それを示しています

unique(as.numeric( unlist(strsplit(gsub("[][(]" , "", levels(bins)[1:5]) , ",")))) 
[1] 0.00501617 0.05188750 0.05948310 0.06406790 0.06700620 0.06941940 
:これはあなたの例でテストし、最初の5つのレベルを使用して小さく、たとえばこれを生成した

unique(     #  (5) 
    as.numeric(     #  (4) 
     unlist(      #  (3) 
      strsplit(     #  (2) 
       gsub("[][(]" , "", levels(bins)[1:5]) , ",") # (1) 
     ))) 

私は単語 "ベクトル化"を引用符で囲みます。なぜなら、R用語ではその単語の意味ではないからです。入力。

小計(ピリオド)をアイテムに残すための私の提案の結果はではなく、が分割基準として使用され、私のコードが提供したものと一致しています。

endpts= na.omit(as.numeric(unlist(strsplit(as.character(unlist(bins)),"[^0-9.]+")))) 

head(endpts) 
#[1] 0.216698 0.216709 0.243665 0.243682 0.201100 0.201114 
end2 <- unique(as.numeric( unlist(strsplit(gsub("[][(]" , "", levels(bins)) , ",")))) 
head(end2) 
#[1] 0.00501617 0.05188750 0.05948310 0.06406790 0.06700620 0.06941940 
length(endpts) 
#[1] 2000000 
length(end2) 
#[1] 10001 
2

私はあなたが構造(a, b]を利用できると思います。私は、実際のデータにしてみてくださいしかし、ここで私の試みではありませんでした。

s <- c("(0.0518875,0.0594831]", "0.818032,0.8183]") 
lapply(strsplit(s, ","), function(x) gsub("\\(|]", "", x)) 

[[1]] 
[1] "0.0518875" "0.0594831" 

[[2]] 
[1] "0.818032" "0.8183" 

あなたは数が必要な場合は、as.numericによって数に変更することができます。私は、「インサイドアウトからのネストされたRコードを読み取る」ことを学んだ

unique(as.numeric( unlist( 
       strsplit(gsub("[][(]" , "", levels(bins)[1:5]) , ",")))) 

:この軽くテストしたアプローチに沿って

+0

私は 'lapply'が必要だとは思わない。 –

関連する問題