Frank_C
Frank_C

Reputation: 23

R nested for loop combining rows within one column

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

Answers (1)

akrun
akrun

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

Related Questions