2017-08-21 4 views
-1

Je voudrais manipuler des données pour faire une analyse de réseau en utilisant ggnet.Permutation d'itération par ligne par article

L'ensemble de données est sous forme csv et ressemble à ceci:

offers 
{9425, 5801, 18451, 17958, 16023, 7166} 
{20003, 17737, 4031, 5554} 
{19764, 5553, 5554} 

Ce que je voudrais briser le tableau, et itérer permutant tous les articles chaque ligne comme une paire de 2. Ainsi, la sortie finale devrait ressembler à:

print list(itertools.permutations([1,2,3,4], 2)) per row to create: 

(9425, 5801) 
(9425, 18451) 
(9425, 17958) 
(9425, 16023) 
(9425, 7166) 
(5801, 18451) 
(5801, 17958) 
(5801, 16023) 
(5801, 7166) 
... 

Je pourrais utiliser R ou Python pour ce faire. Des suggestions pour résoudre ce problème?

+1

vous avez déjà trouvé 'itertools.permutations'. que recherchez-vous de plus? –

+0

Est-ce une question sur l'importation des données et/ou permuting? –

Répondre

1

Une autre solution de R, en supposant qu'il n'y a plus de lignes dans votre fichier.

# read in csv file as list of integers (each row in csv = 1 list element) 
offers <- readLines("offers.csv") %>% strsplit(",") %>% lapply(as.integer) 

# create permutation pairs for each element in the list 
permutation.list <- lapply(seq_along(offers), function(i) {t(combn(offers[[i]], m = 2))}) 

# combine all permutation pairs into 1 data frame 
permutation.data.frame <- plyr::ldply(permutation.list, data.frame) 

Voici les résultats à partir des données d'échantillons fournis:

> permutation.list 
[[1]] 
     [,1] [,2] 
[1,] 9425 5801 
[2,] 9425 18451 
[3,] 9425 17958 
[4,] 9425 16023 
[5,] 9425 7166 
[6,] 5801 18451 
[7,] 5801 17958 
[8,] 5801 16023 
[9,] 5801 7166 
[10,] 18451 17958 
[11,] 18451 16023 
[12,] 18451 7166 
[13,] 17958 16023 
[14,] 17958 7166 
[15,] 16023 7166 

[[2]] 
     [,1] [,2] 
[1,] 20003 17737 
[2,] 20003 4031 
[3,] 20003 5554 
[4,] 17737 4031 
[5,] 17737 5554 
[6,] 4031 5554 

[[3]] 
     [,1] [,2] 
[1,] 19764 5553 
[2,] 19764 5554 
[3,] 5553 5554 

> permutation.data.frame 
     X1 X2 
1 9425 5801 
2 9425 18451 
3 9425 17958 
4 9425 16023 
5 9425 7166 
6 5801 18451 
7 5801 17958 
8 5801 16023 
9 5801 7166 
10 18451 17958 
11 18451 16023 
12 18451 7166 
13 17958 16023 
14 17958 7166 
15 16023 7166 
16 20003 17737 
17 20003 4031 
18 20003 5554 
19 17737 4031 
20 17737 5554 
21 4031 5554 
22 19764 5553 
23 19764 5554 
24 5553 5554 
1

vous pouvez essayer cela dans R:

a <- c(9425, 5801, 18451, 17958, 16023, 7166) 
b <- c(20003, 17737, 4031, 5554) 
c <- c(19764, 5553, 5554) 

rbind(t(combn(a,2)), 
t(combn(b,2)), 
t(combn(c,2))) 
1
t(do.call(cbind,mapply(combn,list(a,b,c),2))) 
     [,1] [,2] 
[1,] 9425 5801 
[2,] 9425 18451 
[3,] 9425 17958 
[4,] 9425 16023 
[5,] 9425 7166 
[6,] 5801 18451 
[7,] 5801 17958 
[8,] 5801 16023 
[9,] 5801 7166 
[10,] 18451 17958 
[11,] 18451 16023 
[12,] 18451 7166 
    :  :  : 
    :  :  : 
1

Vous avez déjà les solutions pour les permutations. Pour casser le tableau et le fusionner, ouvrez le fichier csv read line by line et ajoutez-le à list.

from itertools import chain 
import itertools 
#Create Empty Dictionary 
list= [] 
for i, eline in enumerate(CSVfile.readlines()): 
    list.append(eline.strip()) 
MergedArray= {i for j in (list) for i in j} 
#Use your permutations code below 
print list(itertools.permutations(MergedArray, 2))