私はRを使用しており、行数が何百万にもなる大きなデータフレームを持っています。 私は特に1つの列$ pathに興味があります。データフレーム内のテキスト文字列を確率サンプル代替品に置き換える
replace.index <- which(df$path == 'First')
と、この指数が50行を識別想像:私は交換したいエントリを識別するインデックスを生成したこのデータの中から、 。
別の表では、これらの「最初の」エントリのそれぞれを置き換えるために、「サンプル」に使用する確率テーブルを特定しました。この50は私が交換したい行数と一致する
cum
alpha 18
beta 29
gamma 40
delta 50
:
は、この第2のエンティティは「casetable」と呼ばれる名前の付けられた一連の数字である想像してみてください。
私は
18 cases of "First" with "alpha > First"
11 cases of "First" with "beta > First"
11 cases of "First" with "gamma > First"
10 cases of "First" with "delta > First"
を代入し、本質的には、メインテーブル内の以前に同定された行のそれぞれのエントリを上書きするアクションを置き換えるのいくつかの種類を記述しようとしています。
私はこれをforループで実行できると確信していますが、スピードを上げるために、代わりに適用機能を使用したいと思います。私は、次のことを試してみたが、私はそれが権利を取得することはできません。
#'Replacement function'
sampleprevious <- function(rndtbl,upperlimit,reattach) {
return(paste0(names(rndtbl[max(which(rndtbl < runif(1, min=1, max=upperlimit)))])
,' > ', reattach))
}
df$path[replace.index] <-
mapply(paste0, sampleprevious(casetable, 50, 'First'))
これは私が私の反復配列を取得する方法が他に確認されませんでしたとして、乱数サンプリングを使用して、妥協の試みですが、私はのために得ますこれは、50個の別々のサンプリングではなく、各行に対して1つのサンプリングされた値にすぎません。
私は50の無作為抽出を生成するのに満足していますが、派生した分割だけでも満足しています。18 | 11 | 11 | 10してください。
* _____________ **補遺** 私はこれを使って「サンプリング」バージョン解決した:
sampleprevious <- function(rndtbl,upperlimit,reattach) {
return(paste0(names(rndtbl[min(which(rndtbl > runif(1, min=1, max=upperlimit-1)))])
,'>', reattach))
}
df$path[replace.index] <-
replicate(50, sampleprevious(casetable, 50, 'First'))
を、これは私に私casetableに沿ってランダムな割合を与えます。私はまだ自分のキャセッタブルから正確に行数を生成することを好みます。 tension
変数があなたのpath
ある
「casetable」と希望の結果との関係は私には分かりません。あなたは精緻化できますか?サンプリングウェイトを与えるはずですか? – effel
はい、そうです。私は各新しい文字列に置き換えたいそれぞれの「最初の」エントリの数を事前に計算しています。最初のエントリは私のデータフレームに散在しています。私はそれらを見つけようとしており、n/50の確率でそれらを新しい文字列で置き換えます。私のケースでは、単純な確率関数を可能にするために累積合計を使用しました。 – Jon