我有下表:
.filter('customMemberFilter', function() {
return function(memberList, query) {
// make sure a query value was passed
if (query) {
query = query.toLowerCase();
var out = [];
angular.forEach(memberList, function(member) {
if ((member.FirstName.toLowerCase().includes(query)) ||
(member.LastName.toLowerCase().includes(query))) {
out.push(member);
}
});
return out;
} else {
return memberList;
}
}
})
我想得到一个矩阵,其中m1和m2的所有条目都按行和列名称按特定顺序排列。它也应该是对称的。矩阵中的条目是m1和m2的所有组合的平均值。所以下表中的2.3是fr-tr,tr-fr和tr-fr的平均值。
<tr ng-repeat="member in members | customMemberFilter:memberFilter | orderBy:sortBy:reverse">
我尝试了什么:
avg m1 m2
3 gl fr
1 fr tr
2 tr fr
4 la gl
5 na fr
6 tr tr
4 tr fr
这不是我需要的。它不是对称的,它区分了m1和m2的顺序。
另外,对于对称矩阵,我如何将其设为三角形?
答案 0 :(得分:2)
您的数据:
df <- read.table(text='avg m1 m2
3 gl fr
1 fr tr
2 tr fr
4 la gl
5 na fr
6 tr tr
4 tr fr', header=T, stringsAsFactors=F)
您的姓名,已下令:
nm <- c('gl', 'tr', 'la', 'na', 'fr')
存储结果的矩阵:
m <- matrix(nrow = length(nm), ncol = length(nm),
dimnames = list(nm, nm))
首先,由于您所需的结果是对称的,因此我们不关心m1
与m2
的排序。通过对它们进行排序(m1
始终“小于”m2
),我们使聚合更简单:
df[,c('m1','m2')] <- t(apply(df[,c('m1','m2')], 1, sort))
虽然经常被忽视,但这是使用aggregate
:
df2 <- aggregate(avg ~ m1 + m2, df, mean)
for (i in 1:nrow(df2)) {
m[ df2$m1[i], df2$m2[i] ] <- m[ df2$m2[i], df2$m1[i] ] <- df2$avg[i]
}
m
# gl tr la na fr
# gl NA NA 4 NA 3.000000
# tr NA 6.000000 NA NA 2.333333
# la 4 NA NA NA NA
# na NA NA NA NA 5.000000
# fr 3 2.333333 NA 5 NA