我对循环数据框并获得某个变量的所有组合(不重复)感兴趣。
这可以存储在列表中,然后作为列附加到新数据帧。 我想用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。我相对较新,感谢您的耐心等待:)。
答案 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