r

时间:2017-02-03 19:27:45

标签: r for-loop while-loop

编辑:重写

我有一个帐户列表: 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)
  }
}

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)(两个数据帧中唯一的列)合并这两个数据。