我想操纵数据来使用ggnet进行网络分析。
数据集采用csv格式,如下所示:
offers
{9425, 5801, 18451, 17958, 16023, 7166}
{20003, 17737, 4031, 5554}
{19764, 5553, 5554}
我想打破数组,并迭代以将每一行的所有项目置换为一对2.所以最终输出应该如下所示:
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)
...
我可以用R或Python来做这件事。 有什么建议可以解决这个问题吗?
答案 0 :(得分:1)
您可以在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 :(得分:1)
另一个R解决方案,假设您的文件中有更多行。
# 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)
以下是基于所提供的样本数据的结果:
> 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
答案 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
: : :
: : :
答案 3 :(得分:1)
您已经拥有排列解决方案。要打破数组并合并它,请逐行打开csv读取并附加到列表中。
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))