編輯:重新措辭條件while循環中的R
我有帳戶的列表: accountdf < -
Account Owner Value
Acc1 Jeff 500
Acc2 Jeff 100
Acc3 Jeff 200
Acc4 Jeff 700
Acc5 Matt 400
Acc6 Matt 500
Acc7 Matt 600
Acc8 Matt 20
Acc9 Matt 80
Acc10 Matt 1400
Acc11 Cindy 50
Acc12 Cindy 50
Acc13 Cindy 150
Acc14 Cindy 600
Acc15 Cindy 600
Acc16 Cindy 1350
Acc17 Cindy 800
Acc18 Cindy 400
Acc19 Sarah 1500
Acc20 Sarah 3000
Acc21 1000
Acc22 400
Acc23 500
Acc24 800
Acc25 900
當我總結這個名單,我得到賬戶的數量和總價值的概述佔
namesummarydf < -
Name Accounts Value
Jeff 4 1500
Matt 6 3000
Cindy 8 4000
Sarah 2 3500
Mark 0 0
我已經添加了Mark,因爲他現在將成爲賬戶所有者,但他目前沒有任何賬戶。
第一步是查看每個人應該擁有的帳戶的平均值。有25個賬戶和5個所有者,所以每個人都應該有5個賬戶。總價值爲15,600,並且有5個所有者,所以每個人的賬戶價值應該在3120左右。這是一個估計,所以我很好,它有點偏離。 (在我的實際數據中,我有300個所有者和80,000個帳戶,其中一些是擁有的,其他的不是)
由於每個人都應該有5個帳戶,因此我們需要從擁有太多帳戶的人/或太多的價值(超過3120)。 Matt有6個賬戶,價值3000,Cindy有8個,價值4000,Sarah有2個賬戶,價值3500.
我試圖做的是一個循環遍歷每個總結列表中的名稱,並期待看看他們的賬戶是否超過平均水平或超過平均水平。如果是,那麼通過賬戶名單查看他們名下的賬戶,然後在他們自己的價值的四分位數範圍內隨機選擇一個賬戶。 這種隨機選擇將專門帶走大值賬戶,中等價值或低價值,而不是完全隨機的。爲了保持高價值帳戶的完整性,我想在20%和40%的百分比之間抽取一些帳戶。百分比範圍將是每個帳戶的$ $$。
如果某人的賬戶範圍從50美元到10000美元不等,那麼20%和40%的個人賬戶價值在2,000美元到4000美元之間。
while循環將刪除一個隨機賬戶,然後回顧新的計數和該人員姓名的總值(現在減少1個賬戶,並且減少$ 2,000)。然後它會查看它是否仍高於平均水平,並不斷刪除帳戶直到達到閾值。它會爲每個人做到這一點,所以它會系統地從人們的名字中刪除賬戶,直到他們擁有更少的賬戶和少量的美元。
我已經發現的下一步是for循環,該循環遍歷賬戶中沒有所有者的賬戶列表,並將它們分配給與其名稱相關聯的最低值的人員。
我的while循環的麻煩是我希望它看起來,看看這個人是否有超過5個帳戶,或者超過平均值$$ s。莎拉例如有2個賬戶,但有3500個賬戶。一個高價值賬戶應該從她的名單中刪除,因此她有空間分配更小的賬戶來填補5個賬戶的配額。
for (p in 1:nrow(namesummarydf)){
nameidx <- namesummarydf$Name[p]
while (namesummarydf$count[p] > mean(namesummarydf$count) | namesummarydf$Value[p] > mean(namesummarydf$Value)){
sample(accountdf , which(accountdf$Owner == nameidx &
(accountdf$totalnewcovalue > quantile(accountdf$Value, prob = 0.15) &
accountdf$totalnewcovalue < quantile(accountdf $Value, prob = 0.45))), 1)
}
}
你能說清楚一個問題嗎?並分享一些可重複的數據?你的號碼中的那些美元符號和逗號正在阻礙你。如果您爲該輸入提供可複製粘貼的示例輸入和所需的輸出,您將更快地獲得幫助。 [請參閱此處瞭解可重複共享數據的提示](http://stackoverflow.com/q/5963269/903061):使用'dput'或共享代碼來模擬它。 – Gregor
也請刪除頂部的'while'循環或詳細說明爲什麼/如何「知道它的錯誤」。還要評論第一個while循環和底部的while循環之間的差異。第一個使用'|',但真正的使用'&',這使得它們非常不同。 – Gregor
你不需要爲此循環。矢量化的'merge','match'或'aggregate'和'ifelse'可能會起作用。看起來您正在檢查* count *和* value *列的平均值和分位數,但是您指定的* unassign *的含義並不明確。 – Parfait