2016-06-13 62 views
0

我正在使用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中精確地生成行數。

+1

'casetable'和預期結果之間的關係,我不清楚。你能詳細說明嗎?它應該提供抽樣權重? – effel

+0

是的。我已經預先計算了每個新字符串要替換的每個「第一」條目的數量。第一項分散在我的數據框中,我只是想找到它們,並用n/50的概率替換爲新的字符串。在我的案例中,我使用累計總數來允許簡單的概率函數。 – Jon

回答

0

重現數據,其中tension變量是您path

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 

我們需要知道有多少樣品取代。從replacementcasetable,從其n柱概率

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

樣品subset_n值,並且在更換的warpbreakstension列的現有值,其中tension是一個特定的值,L。(這是在您的數據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