我在SO上读了一个类似的问题:如何更新Aggregate中的实体,但我仍然不确定用户界面应该如何与聚合内的实体进行交互.
假设我有User一堆,有一堆Addresses.用户是聚合根,而地址仅存在于聚合中.
在Web界面上,用户可以编辑他的地址.基本上,会发生什么:
edit-address?user=1&address=2我决定绕过聚合根,这很简单:
Address它Id因为我们想用DDD方式做,所以我们有不同的解决方案:
我们要求用户通过Id获取此地址:
address = user.getAddress(id);
address.setPostCode("12345");
address.setCity("New York");
em.persist(user);
这种方法的问题是,IMO,聚合根仍然没有更多的控制地址的作用.它只返回对它的引用,因此与绕过聚合没有太大区别.
或者我们告诉聚合更新现有地址:
user.updateAddress(id, "12345", "New York");
em.persist(user);
现在,聚合控制了对此地址所做的操作,并且可以采取任何必要的操作来更新地址.
或者我们将地址视为值对象,我们不更新我们的Address,而是删除它并重新创建它:
user.removeAddress(id);
address = new Address();
address.setPostCode("12345");
address.setCity("New York");
user.addAddress(address);
em.persist(user);
最后一个解决方案看起来很优雅,但意味着地址不能是实体.然后,如果需要将其视为实体,例如因为聚合中的另一个业务对象具有对它的引用,该怎么办?
我很确定我在这里遗漏了一些东西,以正确理解聚合概念以及它如何在现实生活中使用,所以请不要犹豫,发表您的意见!
我试着通过在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对如何做到这一点有所了解?谢谢!
我正在使用光栅包来降低大栅格的分辨率,使用像这样的函数聚合
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函数.
我试图在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语句.
基本上我想要的是根据时间跨度在表中聚合一些值.
我所做的是,我每隔15分钟拍摄一个系统的快照,我希望能够在很长一段时间内绘制一些图表.如果显示太多的点(除了渲染速度非常慢)之外,图形会变得非常混乱,我想通过对多个点进行平均来将多个点聚合到一个点来减少点数.
为此,我必须能够通过我可以定义的桶(每天,每周,每月,每年......)进行分组,但到目前为止,我的所有实验都没有运气.
有什么技巧可以申请吗?
我想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?
我试图复制官方统计中经常使用的表,但到目前为止没有成功.给定像这样的数据帧:
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中导出表.
提前致谢
我目前正在研究Eric Evans'es Domain-Driven-Design.聚合的想法对我来说很清楚,我发现它非常有趣.现在我想到一个像聚合的例子:
BankAccount(1)---->(*)交易.
BankAccount
BigDecimal calculateTurnover();
Run Code Online (Sandbox Code Playgroud)
BankAccount是一个聚合.为了计算营业额,我应该遍历所有交易并总结所有金额.埃文斯假设我应该使用存储库来加载aggreagates.在上面的例子中,可能有几万个事务,我不希望在内存中同时加载.
在存储库模式的上下文中,聚合根是唯一的对象>您的客户端代码从存储库加载.
存储库封装了对子对象的访问 - 从调用者的角度来看,它会自动加载它们,无论是在加载根目录还是实际需要它们时(如延迟加载).
你有什么建议在DDD聚合中实现calulcateTurnover?
是否有可能预先计算(缓存)两个信号差异的值的聚合(最小值/最大值/平均值)?
我有几个通道(例如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个频道的任何组合,似乎我无法重复使用此信息. …
我想在一组(纬度,经度)对上使用单个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)