Reputation: 23
I'm interested in looping over a dataframe and getting all combinations (without repetition) of a certain variable.
This can be stored in a list, and later appended to a new dataframe as a column. I would like to achieve this using R, but Python would be ok as well.
My current data:
idx A B C
1 name1 val_x1 val_y1
2 name2 val_x2 val_y2
3 name3 val_x3 val_y3
...
10 name10 val_x10 val_y10
Since n-1 = 9 and 9+8...+1 = 45 my desired data would be, as a list:
c("name1_name2","name1_name3","name1_name4",...,"name9_name10")
and later on as a dataframe:
idy D
1 name1_name2
2 name1_name3
3 name1_name4
...
45 name9_name10
I thought to make a list out of the desired data, with a nested for loop, but it doesn't work as I'm probably doing something (multiple things?) wrong.
i <- 1
j <- 2
k <- 1
new_list <- c()
while (k < 45)
while (i < 11){
while (j < 10){
new_list[[k]] <- paste(df$A[i], df$A[j], sep="_")
j <- j + 1
k <- k + 1
}
i <- i + 1
}
This is not working as said, any tips are welcome.
PS. I'm relatively new, thanks for your patience :)
Upvotes: 2
Views: 222
Reputation: 887951
We can use expand.grid
do.call(paste, c(subset(expand.grid(rep(list(df1$A), 2)), Var1 != Var2), sep="_"))
Or with combn
D <- combn(df1$A, 2, FUN = paste, collapse="_")
res <- data.frame(idy = seq_along(D), D, stringsAsFactors=FALSE)
dim(res)
#[1] 45 2
res
# idy D
#1 1 name1_name2
#2 2 name1_name3
#3 3 name1_name4
#4 4 name1_name5
#5 5 name1_name6
#6 6 name1_name7
#7 7 name1_name8
#8 8 name1_name9
#9 9 name1_name10
#10 10 name2_name3
#11 11 name2_name4
#12 12 name2_name5
#13 13 name2_name6
#14 14 name2_name7
#15 15 name2_name8
#16 16 name2_name9
#17 17 name2_name10
#18 18 name3_name4
#19 19 name3_name5
#20 20 name3_name6
#21 21 name3_name7
#22 22 name3_name8
#23 23 name3_name9
#24 24 name3_name10
#25 25 name4_name5
#26 26 name4_name6
#27 27 name4_name7
#28 28 name4_name8
#29 29 name4_name9
#30 30 name4_name10
#31 31 name5_name6
#32 32 name5_name7
#33 33 name5_name8
#34 34 name5_name9
#35 35 name5_name10
#36 36 name6_name7
#37 37 name6_name8
#38 38 name6_name9
#39 39 name6_name10
#40 40 name7_name8
#41 41 name7_name9
#42 42 name7_name10
#43 43 name8_name9
#44 44 name8_name10
#45 45 name9_name10
Upvotes: 1