从列条目创建矩阵

时间:2016-03-20 03:27:05

标签: r matrix

我有下表:

.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的顺序。

另外,对于对称矩阵,我如何将其设为三角形?

1 个答案:

答案 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))

首先,由于您所需的结果是对称的,因此我们不关心m1m2的排序。通过对它们进行排序(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