R嵌套用于循环组合一列

时间:2017-06-04 09:46:17

标签: r for-loop

我对循环数据框并获得某个变量的所有组合(不重复)感兴趣。

这可以存储在列表中,然后作为列附加到新数据帧。 我想用R来实现这一点,但Python也可以。

我目前的数据:

    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

因为n-1 = 9 和9 + 8 ... + 1 = 45 我想要的数据将是一个列表:

    c("name1_name2","name1_name3","name1_name4",...,"name9_name10")

以后作为数据框:

    idy     D
    1    name1_name2
    2    name1_name3
    3    name1_name4
    ...
    45   name9_name10

我想用一个嵌套的for循环来制作所需数据的列表,但它不起作用,因为我可能做了一些事情(多件事?)错误。

    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
        }

这说法没有用,欢迎任何提示。

PS。我相对较新,感谢您的耐心等待:)。

1 个答案:

答案 0 :(得分:1)

我们可以使用expand.grid

do.call(paste, c(subset(expand.grid(rep(list(df1$A), 2)), Var1 != Var2), sep="_"))

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