You can use this bruteforce approach:
Result would be:
[1] "p2,p9" "p3,p6" "p4,p5" "p7,p10" "p8,p10" "p1,p2,p4" "p1,p2,p5"
[8] "p1,p3,p9" "p1,p6,p7" "p1,p6,p8" "p3,p4,p7" "p3,p4,p8" "p3,p5,p7" "p3,p5,p8"
[15] "p7,p8,p9" "p1,p2,p3,p7" "p1,p2,p3,p8" "p1,p4,p7,p8" "p1,p5,p7,p8"
Data:
x<-c("p1","p2","p3","p4","p5","p6","p7","p8","p9","p10")
y<-c(1,4,3,5,5,7,2,2,6,8)
df<-data.frame(x=x,y=y, stringsAsFactors = FALSE)
df$id <- seq_len(nrow(df)) # Adding an ID column
Get all possible combinations of upto max_comb
elements
max_comb <- nrow(df)
my_combn <- function(m, x){
combn(x, m, simplify = FALSE)
}
dat <- lapply(1:max_comb, my_combn, df$id)
Set names to the picked combinations
combn_names <- function(ind, vec, collapse = ", "){
paste(vec[ind], collapse = collapse)
}
set_list_combn_names <- function(l, vec){
setNames(l, lapply(l, combn_names, vec = vec))
}
dat <- lapply(dat, set_list_combn_names, df$x)
Check if sum is equal to x=10
and output names of combinations
sum_equal_x <- function(ind, vec, x){
sum(vec[ind]) == x
}
names(which(unlist(lapply(dat, lapply, sum_equal_x, df$y, 10))))
Result:
> names(which(unlist(lapply(dat, lapply, sum_equal_x, df$y, 10))))
[1] "p2,p9" "p3,p6" "p4,p5" "p7,p10" "p8,p10" "p1,p2,p4" "p1,p2,p5"
[8] "p1,p3,p9" "p1,p6,p7" "p1,p6,p8" "p3,p4,p7" "p3,p4,p8" "p3,p5,p7" "p3,p5,p8"
[15] "p7,p8,p9" "p1,p2,p3,p7" "p1,p2,p3,p8" "p1,p4,p7,p8" "p1,p5,p7,p8"