2016-06-13 10 views
0

私は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ある

+1

「casetable」と希望の結果との関係は私には分かりません。あなたは精緻化できますか?サンプリングウェイトを与えるはずですか? – effel

+0

はい、そうです。私は各新しい文字列に置き換えたいそれぞれの「最初の」エントリの数を事前に計算しています。最初のエントリは私のデータフレームに散在しています。私はそれらを見つけようとしており、n/50の確率でそれらを新しい文字列で置き換えます。私のケースでは、単純な確率関数を可能にするために累積合計を使用しました。 – Jon

答えて

0

再生可能なデータ:

data(warpbreaks) 
warpbreaks$tension <- as.character(warpbreaks$tension) 

casetableは、置換値とその重みを与えるだろう。

casetable <- data.frame(replacement = letters[1:3], n = c(2, 4, 6), 
         stringsAsFactors = FALSE) 
# replacement n 
# 1   a 2 
# 2   b 4 
# 3   c 6 

サンプルをいくつ置き換えるかを知る必要があります。そのnカラムからの確率を有するcasetablereplacementカラムから

subset_n <- sum(warpbreaks$tension == "L") 
# [1] 18 

サンプルsubset_n値、及びtensionが特定の値、Lwarpbreakstensionカラムの既存の値を置き換えます。(これはあなたのデータ内にFirstです)

warpbreaks[warpbreaks$tension == "L", "tension"] <- 
    sample(casetable$replacement, size = subset_n, replace = TRUE, 
     prob = casetable$n) 
warpbreaks 
# breaks wool tension 
# 1  26 A  c 
# 2  30 A  b 
# 3  54 A  c 
# 4  25 A  c 
# 5  70 A  c 
# 6  52 A  a 
# 7  51 A  b 
# 8  26 A  b 
# 9  67 A  c 
# 10  18 A  M 
# 11  21 A  M 
# 12  29 A  M 
+0

はい - 私はそれに従うことができます、ありがとうございます。私は何らかのリスト機能が必要だと判断したと思いますが、本当にリストからデータを入れ替えて入れ替えることはできます。多くの感謝、質問に答えました。 – Jon

関連する問題