我正在使用R,並且我有一個大型數據框,其中行數以百萬爲單位。 我特別感興趣,但只有一列,$路徑。 從這個數據中我已經產生其標識我希望替換項的索引:用替換概率替換數據框中的文本字符串
replace.index <- which(df$path == 'First')
和想象這索引標識50行。
在一張單獨的表中,我已經確定了一個概率表,我希望用它來「取樣」以替換這些「第一」條目中的每一個。
想象這第二個實體是一系列數字命名的所謂「casetable」:
cum
alpha 18
beta 29
gamma 40
delta 50
其中這50場比賽我要替換的行數。
我想寫某種替代其替代
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循環來運行這個,但爲了提高速度,我想用一個apply函數來代替,這是我無法解決的。我試過以下,但我無法得到它的權利:
#'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個單獨採樣的單個採樣值。
我很樂意幫助您生成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。我仍然希望從我的casetable中精確地生成行數。
'casetable'和預期結果之間的關係,我不清楚。你能詳細說明嗎?它應該提供抽樣權重? – effel
是的。我已經預先計算了每個新字符串要替換的每個「第一」條目的數量。第一項分散在我的數據框中,我只是想找到它們,並用n/50的概率替換爲新的字符串。在我的案例中,我使用累計總數來允許簡單的概率函數。 – Jon