标签: aggregate

更新聚合内的实体

我在SO上读了一个类似的问题:如何更新Aggregate中的实体,但我仍然不确定用户界面应该如何与聚合内的实体进行交互.

假设我有User一堆,有一堆Addresses.用户是聚合根,而地址仅存在于聚合中.

在Web界面上,用户可以编辑他的地址.基本上,会发生什么:

  • 用户在其Web界面上看到地址列表
  • 他点击了一个地址,然后被重定向到这个页面: edit-address?user=1&address=2
  • 在这个页面上,他得到一个表格,他可以修改这个地址.

我决定绕过聚合根,这很简单:

  • 我们会直接加载AddressId
  • 我们会更新它,然后保存它

因为我们想用DDD方式做,所以我们有不同的解决方案:

  1. 我们要求用户通过Id获取此地址:

    address = user.getAddress(id);
    address.setPostCode("12345");
    address.setCity("New York");
    em.persist(user);

    这种方法的问题是,IMO,聚合根仍然没有更多的控制地址的作用.它只返回对它的引用,因此与绕过聚合没有太大区别.

  2. 或者我们告诉聚合更新现有地址:

    user.updateAddress(id, "12345", "New York");
    em.persist(user);

    现在,聚合控制了对此地址所做的操作,并且可以采取任何必要的操作来更新地址.

  3. 或者我们将地址视为值对象,我们不更新我们的Address,而是删除它并重新创建它:

    user.removeAddress(id);
    address = new Address();
    address.setPostCode("12345");
    address.setCity("New York");
    user.addAddress(address);
    em.persist(user);

    最后一个解决方案看起来很优雅,但意味着地址不能是实体.然后,如果需要将其视为实体,例如因为聚合中的另一个业务对象具有对它的引用,该怎么办?

我很确定我在这里遗漏了一些东西,以正确理解聚合概念以及它如何在现实生活中使用,所以请不要犹豫,发表您的意见!

orm domain-driven-design aggregate aggregateroot

8
推荐指数
1
解决办法
2063
查看次数

R在函数中聚合多个参数

我试着通过在data.frame上使用聚合来避免耗时的循环.但我需要其中一列的值进入最终计算.

dat <- data.frame(key = c('a', 'b', 'a','b'), 
rate = c(0.5,0.4,1,0.6), 
v1 = c(4,0,3,1), 
v2 = c(2,0,9,4))

>dat
  key rate v1 v2
1   a  0.5  4  2
2   b  0.4  0  0
3   a  1.0  3  9
4   b  0.6  1  4

aggregate(dat[,-1], list(key=dat$key),  
    function(x, y=dat$rate){
        rates <- as.numeric(y)
        values <- as.numeric(x)
        return(sum(values*rates)/sum(rates))
    })
Run Code Online (Sandbox Code Playgroud)

注意:该功能只是一个例子!
这个实现的问题是y=dat$rate在dat上提供所有4个速率,当我想要的只是2个聚合速率!Anny对如何做到这一点有所了解?谢谢!

aggregate r dataframe

8
推荐指数
2
解决办法
6978
查看次数

更快的降低光栅R分辨率的功能

我正在使用光栅包来降低大栅格的分辨率,使用像这样的函数聚合

require(raster)    
x <- matrix(rpois(1000000, 2),1000)

a <-raster(x)
plot(a)

agg.fun <- function(x,...) 
    if(sum(x)==0){
        return(NA)
    } else {
        which.max(table(x))
    }

a1<-aggregate(a,fact=10,fun=agg.fun)
plot(a1)
Run Code Online (Sandbox Code Playgroud)

我必须聚合的光栅图像大得多34000x34000所以我想知道是否有更快的方法来实现agg.fun函数.

aggregate r raster r-raster

8
推荐指数
1
解决办法
1966
查看次数

SQL Select语句用于计算运行平均列

我试图在SELECT语句中有一个基于同一SELECT语句中n个前一行的列的运行平均列.我需要的平均值基于结果集中的前n行.

让我解释

Id        Number       Average
 1             1          NULL
 2             3          NULL
 3             2          NULL
 4             4             2 <----- Average of (1, 3, 2),Numbers from previous 3 rows
 5             6             3 <----- Average of (3, 2, 4),Numbers from previous 3 rows
 .             .             .
 .             .             .
Run Code Online (Sandbox Code Playgroud)

Average列的前3行为null,因为之前没有行."平均值"列中的第4行显示前3行中"数字"列的平均值.

我需要一些帮助来尝试构建一个将执行此操作的SQL Select语句.

t-sql sql-server aggregate sql-server-2008

7
推荐指数
2
解决办法
2万
查看次数

在MySQL中按时间间隔聚合数据

基本上我想要的是根据时间跨度在表中聚合一些值.

我所做的是,我每隔15分钟拍摄一个系统的快照,我希望能够在很长一段时间内绘制一些图表.如果显示太多的点(除了渲染速度非常慢)之外,图形会变得非常混乱,我想通过对多个点进行平均来将多个点聚合到一个点来减少点数.

为此,我必须能够通过我可以定义的桶(每天,每周,每月,每年......)进行分组,但到目前为止,我的所有实验都没有运气.

有什么技巧可以申请吗?

mysql group-by aggregate

7
推荐指数
1
解决办法
4816
查看次数

用聚合解决ddply任务的优雅方法(希望获得更好的性能)

我想data.frame通过一个名为变量的标识符变量来聚合ensg.数据框如下所示:

  chromosome probeset               ensg symbol    XXA_00    XXA_36    XXB_00
1          X  4938842 ENSMUSG00000000003   Pbsn  4.796123  4.737717  5.326664
Run Code Online (Sandbox Code Playgroud)

我想计算具有相同ensg值的行上每个数字列的平均值.这里的问题是我想保留其他身份变量染色体和符号不变,因为它们也是相同的ensg.

最后,我想有一个data.frame带有标识列chromosome,ensg,symbol并在具有相同标识符行数值列的意思.我实现了这个ddply,但与以下相比它非常慢aggregate:

spec.mean <- function(eset.piece)
  {
    cbind(eset.piece[1,-numeric.columns],t(colMeans(eset.piece[,numeric.columns])))
  }
t
mean.eset <- ddply(eset.consensus.grand,.(ensg),spec.mean,.progress="tk")
Run Code Online (Sandbox Code Playgroud)

我的第一个聚合实现看起来像这样,

mean.eset=aggregate(eset[,numeric.columns], by=list(eset$ensg), FUN=mean, na.rm=TRUE);
Run Code Online (Sandbox Code Playgroud)

并且要快得多.但问题aggregate是我必须重新描述描述变量.我还没有弄清楚如何使用我的自定义函数,aggregate因为aggregate它不传递数据帧而只传递矢量.

是否有一种优雅的方式来做到这一点aggregate?或者有更快的方法来做到这一点ddply

aggregate r plyr

7
推荐指数
2
解决办法
1992
查看次数

R中有几个变量的频率表

我试图复制官方统计中经常使用的表,但到目前为止没有成功.给定像这样的数据帧:

d1 <- data.frame( StudentID = c("x1", "x10", "x2", 
                          "x3", "x4", "x5", "x6", "x7", "x8", "x9"),
             StudentGender = c('F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'M', 'M'),
             ExamenYear    = c('2007','2007','2007','2008','2008','2008','2008','2009','2009','2009'),
             Exam          = c('algebra', 'stats', 'bio', 'algebra', 'algebra', 'stats', 'stats', 'algebra', 'bio', 'bio'),
             participated  = c('no','yes','yes','yes','no','yes','yes','yes','yes','yes'),  
             passed      = c('no','yes','yes','yes','no','yes','yes','yes','no','yes'),
             stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)

我想创建一个表格,显示每年,所有学生(所有)和女性,参与者和通过的人数.请注意下面的"ofwhich"指的是所有学生.

我想到的一张桌子看起来像这样:

cbind(All = table(d1$ExamenYear),
  participated      = table(d1$ExamenYear, d1$participated)[,2],
  ofwhichFemale     = table(d1$ExamenYear, d1$StudentGender)[,1],
  ofwhichpassed     = table(d1$ExamenYear, d1$passed)[,2])
Run Code Online (Sandbox Code Playgroud)

我相信在R.这种事情有更好的方法.

注意:我已经看过LaTex解决方案,但我没有使用这对我有用,因为我需要在Excel中导出表.

提前致谢

aggregate r frequency

7
推荐指数
1
解决办法
2万
查看次数

DDD(Domain-Driven-Design) - 大型聚合

我目前正在研究Eric Evans'es Domain-Driven-Design.聚合的想法对我来说很清楚,我发现它非常有趣.现在我想到一个像聚合的例子:

BankAccount(1)---->(*)交易.

BankAccount
BigDecimal calculateTurnover();
Run Code Online (Sandbox Code Playgroud)

BankAccount是一个聚合.为了计算营业额,我应该遍历所有交易并总结所有金额.埃文斯假设我应该使用存储库来加载aggreagates.在上面的例子中,可能有几万个事务,我不希望在内存中同时加载.

在存储库模式的上下文中,聚合根是唯一的对象>您的客户端代码从存储库加载.

存储库封装了对子对象的访问 - 从调用者的角度来看,它会自动加载它们,无论是在加载根目录还是实际需要它们时(如延迟加载).

你有什么建议在DDD聚合中实现calulcateTurnover?

domain-driven-design aggregate

7
推荐指数
1
解决办法
2051
查看次数

缓存时间序列的差异聚合

是否有可能预先计算(缓存)两个信号差异的值的聚合(最小值/最大值/平均值)?

我有几个通道(例如50个),每秒进行一次或多次测量,我可以轻松存储预先计算的1分钟或15分钟聚合,以便更快地显示.

但其中一个要求是显示相对值的图表.例如,如果我有频道C1,C2并且C3用户希望在单独的图表上查看平均值C1和平均值(C2 - C3)(或最小值/最大值15分钟).

例如,假设我有这两个频道(还有48个频道):

t(min)    0    +1   +2   +3   +4   +5   +6   +7   +8   +9   +10
C1       0.0  0.1  0.2 -0.1  0.0  0.1  0.3  0.5  0.7  0.9  0.2
C2       0.1  0.4  0.2  0.1 -0.1  0.5  0.6  0.1  0.2  0.3  0.0
Run Code Online (Sandbox Code Playgroud)

我可以预先计算并存储5分钟的聚合:

t(min)    0 to +4    +5 to +10
C1_min     -0.1         0.1
C1_max      0.2         0.9
C2_min     -0.1         0.0
C2_max      0.4         0.6
Run Code Online (Sandbox Code Playgroud)

并且很容易从中获得10分钟或15分钟的聚合.

但是,如果用户想要查看min(C2-C1)max(C2-C1)5分钟聚合,对于这50个频道的任何组合,似乎我无法重复使用此信息. …

language-agnostic algorithm caching aggregate

7
推荐指数
1
解决办法
161
查看次数

是否可以在一种类型的集合上执行LINQ聚合到不同的结果类型?

我想在一组(纬度,经度)对上使用单个LINQ聚合,并产生两个(纬度,经度)对:

public Location {
   public double Latitude;
   public double Longitude;
}

List<Location> border = ...;
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式轻松获得最小(纬度,经度)对:

var minBorder =  border.Aggregate( new Location()
                                 { Latitude = double.MaxValue, Longitude = double.MaxValue },
                                 (current, next) =>
                                   new Location()
                                   {
                                     Latitude = (next.Latitude < current.Latitude) ? next.Latitude : current.Latitude,
                                     Longitude = (next.Longitude < current.Longitude) ? next.Longitude : current.Longitude
                                   }) ;
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我想使用单个聚合返回两个位置; 最小(纬度,经度)对和最大(纬度,经度)对而不是一对.

如果我为结果声明一个类:

public class BorderBounds {

   public double MinLatitude;
   public double MinLongitude;

   public double MaxLatitude;
   public double MaxLongitude;
}
Run Code Online (Sandbox Code Playgroud)

并修改聚合:

var borderBounds = …
Run Code Online (Sandbox Code Playgroud)

c# linq aggregate

7
推荐指数
1
解决办法
169
查看次数