在 R 中构建邻接矩阵
Building an adjacency matrix in R
大家好,这是我的问题。
使用
> 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,并在矩阵中插入客户访问每个博物馆的时间。
谢谢
这是一个经典的长宽整形问题
就这样
library(data.table)
dcast(data = visite_cliente, CodCliente ~ museo, value.var = "x")
这不是很漂亮,但是很管用。由于您的数据没有 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
大家好,这是我的问题。
使用
> 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,并在矩阵中插入客户访问每个博物馆的时间。
谢谢
这是一个经典的长宽整形问题
就这样
library(data.table)
dcast(data = visite_cliente, CodCliente ~ museo, value.var = "x")
这不是很漂亮,但是很管用。由于您的数据没有 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