在R

时间:2018-04-23 13:38:57

标签: r adjacency-matrix

Helo大家,这是我的问题。

使用

> visite_cliente <- aggregate(info.uso.2$N,list(CodCliente = info.uso.2$CodCliente, museo = info.uso.2$museo),sum)

我创建了以下矩阵:

> head(visite_cliente)

   CodCliente           museo      x
1       1247 ABBAZIA DI FRUTTUARIA 1
2       3260 ABBAZIA DI FRUTTUARIA 1
3       4104 ABBAZIA DI FRUTTUARIA 1
4       4145 ABBAZIA DI FRUTTUARIA 1
5       5368 ABBAZIA DI FRUTTUARIA 1
6       5530 ABBAZIA DI FRUTTUARIA 1

CodCliente是我的客户ID,而“museo”是客户访问的博物馆(我在数据框中有139个博物馆),X值表示客户在一年内访问博物馆的时间。 在“visite_cliente”中,如果客户访问的不仅仅是博物馆,您可以多次找到相同的ID。

我应该创建一个邻接矩阵,我在其中列出博物馆(如139列),行中的ID,并插入客户访问矩阵中每个博物馆的时间。

谢谢

2 个答案:

答案 0 :(得分:0)

这是一个经典的长广角重塑问题

只是做

library(data.table)

dcast(data = visite_cliente, CodCliente ~ museo, value.var = "x")

答案 1 :(得分:0)

这不太好,但它确实有效。由于您的数据没有重复使用CodCliente,只有一个博物馆,没有重新访问博物馆,我添加了几行。如果将行名称设为CodCliente并且列名称为museo,则可以简单地将它们用作邻接矩阵的索引。

## sample data
visite_cliente = read.table(text="CodCliente   museo      x
1       1247 'ABBAZIA DI FRUTTUARIA' 1
2       3260 'ABBAZIA DI FRUTTUARIA' 1
3       4104 'ABBAZIA DI FRUTTUARIA' 1
4       4145 'ABBAZIA DI FRUTTUARIA' 1
5       5368 'ABBAZIA DI FRUTTUARIA' 1
6       5530 'ABBAZIA DI FRUTTUARIA' 1
7       5530 'ABBAZIA DI FRUTTUARIA' 1
8       1234 'MUSEO EGIZIO'  1
9       1247 'MUSEO EGIZIO'  1",
header=TRUE, stringsAsFactors=FALSE)


Adj = matrix(0, nrow=length(unique(visite_cliente$CodCliente)),
        ncol=length(unique(visite_cliente$museo)),
        dimnames = list(rownames=unique(visite_cliente$CodCliente),
            colnames=unique(visite_cliente$museo)))

for(row in 1:nrow(visite_cliente)) {
    Adj[as.character(visite_cliente[row,1]), visite_cliente[row,2]] =
        Adj[as.character(visite_cliente[row,1]), visite_cliente[row,2]] + 
            visite_cliente[row,3]
}
Adj
        colnames
rownames ABBAZIA DI FRUTTUARIA MUSEO EGIZIO
    1247                     1            1
    3260                     1            0
    4104                     1            0
    4145                     1            0
    5368                     1            0
    5530                     2            0
    1234                     0            1