编辑:重写
我有一个帐户列表: 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个所有者,因此每个人的账户价值应该在3,120左右。这是一个估计,所以我很好,因为它有点偏。 (在我的实际数据中,我有300个所有者和80,000个帐户,其中一些是拥有的,另一些则不是)
由于每个人都应该拥有5个帐户,因此我们需要从拥有太多帐户和/或价值过高(超过3120)的人那里获取帐户。 Matt有6个账户价值3000,Cindy有8个账户价值4000,而Sarah有2个账户价值3500.
我试图做的是一个for循环,它迭代了摘要列表中的每个名称,并查看它们是否具有超过平均值的帐户或超过平均值。如果是,则查看帐户列表中仅显示其名称中的帐户,并在其自身值的四分位数范围内随机选择其中一个。 这种随机选择将专门带走大额账户,中等价值或低价值,而不是完全随机。我想在20%百分位数和40%百分位数之间进行一些账户样本,以保持高价值账户的完整性。百分位数范围是每个帐户的$$。
如果某人的账户金额在50美元到10000美元之间,那么20%和40%的账户价值将在2,000美元到4,000美元左右。
while循环将删除一个随机帐户,然后回顾新计数,以及该人姓名的总值(现在它将减少1个帐户,并减去值2,000美元)。然后它会看到它是否仍高于平均水平并持续删除帐户,直到它达到阈值。它会为每个人这样做,所以它会系统地从人们的名字中删除帐户,直到他们拥有较少的帐户和少量的$$。
我已经想到的下一步是for循环,它遍历没有所有者的帐户的帐户列表,并将它们分配给与其名称关联的最低值的人。
我对while循环的麻烦在于我希望它能够查看该人是否拥有超过5个帐户,或者超过平均$$。例如,Sarah有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)
}
}
答案 0 :(得分:0)
请尝试使用此伪代码:
public class MultipleRequiredAttribute : ValidationAttribute, IClientValidatable
{
private readonly string[] _fields;
public MultipleRequiredAttribute(params string[] fields)
{
_fields = fields;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
// If any field has value, then all must have value
var anyHasValue = _fields.Any(f => !string.IsNullOrEmpty(f));
if (!anyHasValue) return null;
foreach (var field in _fields)
{
var property = validationContext.ObjectType.GetProperty(field);
if (property == null)
return new ValidationResult($"Property '{field}' is undefined.");
var fieldValue = property.GetValue(validationContext.ObjectInstance, null);
if (string.IsNullOrEmpty(fieldValue?.ToString()))
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
return null;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = ErrorMessage,
ValidationType = "multiplerequired"
};
}
}
df1<-data.frame(
N Q M1
Sarah 44 $110,000
Jeff 111 $541,000
Cameron 46 $201,000
Matt 0 $0
Cindy 0 $0
)
df2<-data.frame(
A N M2
Acc1 Sarah $1,200
Acc2 Sarah $900
Acc3 Jeff $700
Acc4 Cameron $880
Acc5 Jeff $4,500
)
它将创建一个data.frame,按列merge(df1, df2)
(两个数据帧中唯一的列)合并这两个数据。