3

に 2 つのデータ フレームがありRます。cumFreqDist最初のデータ フレームは、期間が関連付けられた累積度数分布 ( ) です。データ フレームの最初の行は次のようになります。

Time        cumfreq
0         0.0000000
4         0.9009009
6         1.8018018
8         7.5075075
12       23.4234234
16       39.6396396
18       53.4534535
20       58.2582583
24       75.3753754
100     100.0000000

runif2 番目のデータ フレームは、次のコードを使用して、分布から 10000 回描画されます。

 testData <- (runif(10000))*100

の各行について、対応する を検索し、対応する値を の新しい列に追加しtestDataたいと考えています。は実際のデータ フレームに代わるテスト データ フレームであるため、並べ替えは行いません。cumfreqcumFreqDistTimetestDatatestDatatestData

累積頻度を扱っているため、値testDataが返されるべき値である場合は です。つまり、値を超えない最も近い値を見つけて、その 1 つの値だけを返す必要があります。23.30...Time8cumfreqtestData

このdata.tableパッケージは他の同様の質問で言及されていますが、私の限定的な理解では、このパッケージでは (データ テーブルへの変換後に) 両方のデータ フレームでキーを識別する必要があり、testData値が割り当ての要件を満たしているとは想定できません。キーとして-キーを割り当てるとデータがソートされるようです。これにより、後でシードを設定したときに問題が発生します。

4

1 に答える 1

5

findInterval()これに最適です:

set.seed(1);
cumFreqDist <- data.frame(Time=c(0,4,6,8,12,16,18,20,24,100), cumfreq=c(0.0000000,0.9009009,1.8018018,7.5075075,23.4234234,39.6396396,53.4534535,58.2582583,75.3753754,100.0000000) );
testData <- data.frame(x=runif(10000)*100);
testData$Time <- cumFreqDist$Time[findInterval(testData$x,cumFreqDist$cumfreq)];
head(testData,20);
##            x Time
## 1  26.550866   12
## 2  37.212390   12
## 3  57.285336   18
## 4  90.820779   24
## 5  20.168193    8
## 6  89.838968   24
## 7  94.467527   24
## 8  66.079779   20
## 9  62.911404   20
## 10  6.178627    6
## 11 20.597457    8
## 12 17.655675    8
## 13 68.702285   20
## 14 38.410372   12
## 15 76.984142   24
## 16 49.769924   16
## 17 71.761851   20
## 18 99.190609   24
## 19 38.003518   12
## 20 77.744522   24
于 2015-06-05T02:51:12.573 に答える