Eu tenho um data.table :
groups <- data.table(group = c("A", "B", "C", "D", "E", "F", "G"),
code_1 = c(2,2,2,7,8,NA,5),
code_2 = c(NA,3,NA,3,NA,NA,2),
code_3 = c(4,1,1,4,4,1,8))
group code_1 code_2 code_3
A 2 NA 4
B 2 3 1
C 2 NA 1
D 7 3 4
E 8 NA 4
F NA NA 1
G 5 2 8
O que eu gostaria de alcançar é que cada grupo encontre os vizinhos imediatos com base nos códigos disponíveis. Por exemplo: O grupo A possui grupos vizinhos imediatos B, C devido ao código_1 (código_1 é igual a 2 em todos os grupos) e tem grupos vizinhos imediatos D e E devido ao código_3 (código_3 é igual a 4 em todos esses grupos).
O que eu tentei é para cada código, subconjunto da primeira coluna (grupo) com base nas correspondências da seguinte maneira:
groups$code_1_match = list()
for (row in 1:nrow(groups)){
set(groups, i=row, j="code_1_match", list(groups$group[groups$code_1[row] == groups$code_1]))
}
group code_1 code_2 code_3 code_1_match
A 2 NA 4 A,B,C,NA
B 2 3 1 A,B,C,NA
C 2 NA 1 A,B,C,NA
D 7 3 4 D,NA
E 8 NA 4 E,NA
F NA NA 1 NA,NA,NA,NA,NA,NA,...
G 5 2 8 NA,G
Isso "meio que" funciona, mas eu diria que existe um tipo de tabela com mais dados. eu tentei
groups[, code_1_match_2 := list(group[code_1 == groups$code_1])]
Mas isso não funciona.
Estou perdendo algum truque óbvio da tabela de dados para lidar com isso?
Meu resultado ideal de caso seria assim (o que atualmente exigiria o uso do meu método para todas as 3 colunas e concatenação dos resultados):
group code_1 code_2 code_3 Immediate neighbors
A 2 NA 4 B,C,D,E
B 2 3 1 A,C,D,F
C 2 NA 1 A,B,F
D 7 3 4 B,A
E 8 NA 4 A,D
F NA NA 1 B,C
G 5 2 8
fonte
igraph
, pode ser realmente interessante.Respostas:
Usando o igraph , obtenha vizinhos de segundo grau, elimine nós numéricos e cole os demais.
Mais informações
É assim que nossos dados se parecem antes de converter em objeto igraph. Queremos garantir que o código1 com o valor 2 seja diferente do código2 com o valor 2, etc.
Aqui está como nossa rede se parece:
Observe que os
A..G
nós sempre estão conectadoscode_x_y
. Portanto, precisamos obter o 2º grau,ego(..., order = 2)
fornecer-nos vizinhos até incluir vizinhos de 2º grau e retornar um objeto de lista.Para obter os nomes:
Para prettificar o resultado, precisamos remover os
code_x_y
nós e o nó de origem (1º nó)fonte
Provavelmente existe uma maneira mais prática de conseguir isso, mas você pode fazer algo assim, usando derretimentos e junções:
fonte
Isso é inspirado no derretimento de @ sindri_baldur. Esta solução:
fonte
Conforme mencionado por zx8754, usar
data.table::melt
comcombn
e depoisigraph::as_adjacency_matrix
resultado:
ou sem usar
igraph
resultado:
fonte
xtabs
criar uma saída semelhante àigraph
etapa?table
ouxtabs