2017-02-06 8 views
0

Sie möchten die Ressourcenzuweisung verringern, indem Sie den Namen jeder Ressource durchlaufen und die zugeordneten Konten nach diesem Namen durchsuchen, indem Sie eine Person zufällig auswählen und den Namen dieser Person durch NA ersetzen.Zufällige Unterteilung jeder Gruppe, um die Bedingungen zu erfüllen

reproduzierbares Beispiel:

Accts <- paste0("Acc", 1:200) 
Value <- c(500, 2000, 5000, 1000) 
AccountDF <- data.frame(Accts, Value) 
AccountDF$Owner[1:200] <- NA 
AccountDF$Owner[1:23] <- "Jeff" 
AccountDF$Owner[24:37] <- "Alex" 
AccountDF$Owner[38:61] <- "Steph" 
AccountDF$Owner[62:111] <- "Matt" 
AccountDF$Owner[112:141] <- "David" 

library(dplyr) 
OwnerDF <- AccountDF %>% 
    group_by(Owner) %>% 
    summarise(Count = n(), 
      TotalValue = sum(Value)) %>% 
    filter(!is.na(Owner)) 

Wo ich so weit gekommen:

for (p in 1:nrow(OwnerDF)){ 
    while (AccountDF$Count[p] > 22){ 
    AccountDF %>% 
     filter(Owner == OwnerDF$Owner[p]) %>% 
     sample_n(1) 


    } 
} 

Ich habe gehört, dass für Schleifen unnötig sind. Ich bin sicher, dass dies mit dem schnurren Paket und pmap oder so etwas getan werden kann. Ich lerne noch.

Ich würde gerne durch die OwnerDF iterieren und schauen, ob diese Person zu viele Konten "besitzt". Wenn ja, sehen Sie sich die ursprüngliche Kontoliste an und wählen Sie eine zufällige aus und ersetzen Sie den Namen des Besitzers durch NA, entfernen Sie 1 aus ihrer Zählung und fahren Sie fort.

Schließlich nach dem Ausrechnen würde ich gerne sehen, ob es mit mehreren Bedingungen gemacht werden kann .. wie While (Count> 22 & Wert> $ 40.000), oder vielleicht zwei while-Schleifen. Das Ziel ist es, die "eigenen" Konten jeder Person auf weniger als einen bestimmten Schwellenwert zu reduzieren und auf einen bestimmten Schwellenwert zu reduzieren.

Antwort

1

zufällige Konten zu wählen, nur eine zufällige var machen und es ist eine Art auf, die ersten N-Konten nehmen, die Ihre Bedingungen erfüllen:

set.seed(1) 
res = AccountDF %>% 
    mutate(r = runif(n())) %>% 
    arrange(r) %>% 
    group_by(Owner) %>% 
    mutate(newOwner = replace(Owner, cumsum(Value) > 40000 | row_number() > 22, NA)) %>% 
    select(-r) 

# Test that it worked... 
res %>% 
    filter(!is.na(newOwner)) %>% 
    group_by(newOwner) %>% 
    summarise(Count = n(), TotalValue = sum(Value)) 

# A tibble: 5 x 3 
# newOwner Count TotalValue 
#  <chr> <int>  <dbl> 
# 1  Alex 14  27000 
# 2 David 18  37000 
# 3  Jeff 18  39500 
# 4  Matt 18  39500 
# 5 Steph 17  36500 

Eine Erweiterung des OP in einem Kommentar erwähnt:

Eine andere Frage für Sie. Angenommen, ich habe einen Grenzwert für jeden Wert und jede Zahl, und wenn jemand eine niedrige Anzahl, aber einen hohen Wert hat, möchte ich ein zufälliges Konto von ihren hohen Konten nehmen, wenn sie eine hohe Anzahl und einen niedrigen Wert haben, möchte ich niedrig nehmen Wertkonten von ihnen weg. Wie kann ich das aus einer zufälligen Perspektive tun?

ich wahrscheinlich eine reellwertige Punktzahl zu jeder Beobachtung zuweisen würde, wie ...

s = scale(f(x)) 

wo f einig Funktion auf den Bedingungen, die Sie erwähnen (hohe Anzahl hohen Wert oder beides bezogen ist), vielleicht so einfach wie x, wenn Sie in Richtung der niedrigen Werte und -x neigen möchten, wenn Sie in Richtung der hohen Werte neigen.

Dann auf etwas Rauschen hinzufügen und sortieren das Ergebnis, wie oben mit:

r = s + rnorm(length(s)) 
+0

Erstaunlich. Vielen Dank Frank. Arbeitete perfekt. Ich hätte nie an eine solche Lösung gedacht. Ich weiß nicht viel über Zufallsgenerierung. Eine andere Frage für Sie. Angenommen, ich habe einen Grenzwert für jeden Wert und jede Zahl, und wenn jemand eine niedrige Anzahl, aber einen hohen Wert hat, möchte ich ein zufälliges Konto von ihren hohen Konten nehmen, wenn sie eine hohe Anzahl und einen niedrigen Wert haben, möchte ich niedrig nehmen Wertkonten von ihnen weg. Wie kann ich das aus einer zufälligen Perspektive tun? –

+0

@MattW. Interessante Frage. Sie würden wahrscheinlich eine benutzerdefinierte Funktion rollen, um damit umzugehen. Ich habe etwas zur Antwort hinzugefügt. – Frank

+0

Sie haben mich mit dem letzten Teil Ihrer Erklärung ein bisschen verloren, haha. Auch - ich habe versucht, Ihre Lösung auf meinen Datensatz anzuwenden und ich kann es nicht zum Laufen bringen. Es zerbricht mit dem mutierten Ersatz. Ich kann nicht herausfinden, was ich falsch mache. –

Verwandte Themen