сопоставление имен, прикрепленных к номерам, к комбинациям чисел - PullRequest
0 голосов
/ 10 февраля 2020

следующий код используется для получения всех возможных комбинаций элементов из входного вектора, которые суммируют до 12

w <- c(
  'tomaten_6',
  'karotten_4',
  'paprika_7',
  'erdbeeren_5',
  'koriander_2',
  'salat_3',
  'zucchini_4',
  'gurke_5',
  'petersilie_2',
  'radieschen_3'
)
n <- length(w)
t <- 12
D <- list()
for (j in 0:n) D[[paste(0, j)]] <- list(c())
for (i in 1:t) D[[paste(i, 0)]] <- list()
for (j in 1:n) {
  for (i in 1:t) {
    D[[paste(i, j)]] <- do.call(c, lapply(0:floor(i/as.numeric(strsplit(w[j], '_')[[1]][2])), function(r) {
      lapply(D[[paste(i-r*as.numeric(strsplit(w[j], '_')[[1]][2]), j-1)]], function(x) c(x, rep(strsplit(w[j], '_')[[1]][1]), r))
    }))
  }
}
D[[paste(t, n)]]

. Меня интересуют комбинации имен, которые вместо этого составляют комбинации только цифры. Как я могу прикрепить имена к комбинациям, а не только цифры. Я попытался создать дополнительный вектор, содержащий только имена, но безуспешно. Я все еще думаю, что создание отдельного вектора, содержащего имена, при создании комбинаций чисел, которые суммируют до целевого значения, будет не слишком сложным.

1 Ответ

1 голос
/ 10 февраля 2020

Вот способ сделать это, но это не так просто.


df    <- as.data.frame(do.call(rbind, strsplit(w, "_")), stringsAsFactors = FALSE)
df$V2 <- as.numeric(df$V2)
names(df) <- c("veg", "time")

max_n <- anbaudauer %/% min(df$time)
t     <- unique(df$time)

combos <- do.call(rbind, lapply(seq(max_n), function(n)
{
  m <- expand.grid(as.data.frame(do.call(cbind, lapply(seq(n), function(x) t))))
  m <- m[which(apply(as.matrix(m), 1, sum) == 12), ]
  if(length(nrow(m)) > 0)
  {
    for(i in 1:nrow(m)) m[i, ] <- sort(m[i, ])
    m <- unique(m)
    if(ncol(m) < max_n) m <- cbind(m, matrix(NA, nrow(m), max_n - ncol(m)))
    names(m) <- 1:max_n
    return(m)
  }
}))

combos <- lapply(split(combos, seq(nrow(combos))), 
                 function(x) {x <- as.numeric(x); x[!is.na(x)]})

combos <- lapply(combos, function(x)
{
  expand.grid(as.data.frame(lapply(x, function(y) df$veg[which(df$time == y)]),
                            stringsAsFactors = FALSE), stringsAsFactors = FALSE)
})

combos <- do.call(rbind, lapply(combos, function(x)
{
  for(i in seq(nrow(x))) x[i,] <- sort(x[i,])
  x <- unique(x)
  if(ncol(x) < max_n) 
    x <- cbind(x, matrix("", nrow(x), max_n - ncol(x)), stringsAsFactors = FALSE)
  names(x) <- seq(max_n)
  return(x)
}))

combos <- lapply(split(combos, seq(nrow(combos))), 
       function(x) { x <- as.character(x[1, ]); x[x != ""] })

names(combos) <- NULL

Это дает правильный результат: список векторов символов длиной 103:

combos
#> [[1]]
#> [1] "tomaten" "tomaten"
#> 
#> [[2]]
#> [1] "erdbeeren" "paprika"  
#> 
#> [[3]]
#> [1] "gurke"   "paprika"
#> 
#> [[4]]
#> [1] "karotten"  "koriander" "tomaten"  
#> 
#> [[5]]
#> [1] "karotten"   "petersilie" "tomaten"   
#> 
#> [[6]]
#> [1] "koriander" "tomaten"   "zucchini" 
#> 
#> [[7]]
#> [1] "petersilie" "tomaten"    "zucchini"  
#> 
#> [[8]]
#> [1] "salat"   "salat"   "tomaten"
#> 
#> [[9]]
#> [1] "radieschen" "salat"      "tomaten"   
#> 
#> [[10]]
#> [1] "radieschen" "radieschen" "tomaten"   
#> 
#> [[11]]
#> [1] "karotten" "karotten" "karotten"
#> 
#> [[12]]
#> [1] "karotten" "karotten" "zucchini"
#> 
#> [[13]]
#> [1] "karotten" "zucchini" "zucchini"
#> 
#> [[14]]
#> [1] "zucchini" "zucchini" "zucchini"
#> 
#> [[15]]
#> [1] "erdbeeren" "karotten"  "salat"    
#> 
#> [[16]]
#> [1] "erdbeeren"  "karotten"   "radieschen"
#> 
#> [[17]]
#> [1] "erdbeeren" "salat"     "zucchini" 
#> 
#> [[18]]
#> [1] "erdbeeren"  "radieschen" "zucchini"  
#> 
#> [[19]]
#> [1] "gurke"    "karotten" "salat"   
#> 
#> [[20]]
#> [1] "gurke"      "karotten"   "radieschen"
#> 
#> [[21]]
#> [1] "gurke"    "salat"    "zucchini"
#> 
#> [[22]]
#> [1] "gurke"      "radieschen" "zucchini"  
#> 
#> [[23]]
#> [1] "koriander" "paprika"   "salat"    
#> 
#> [[24]]
#> [1] "paprika"    "petersilie" "salat"     
#> 
#> [[25]]
#> [1] "koriander"  "paprika"    "radieschen"
#> 
#> [[26]]
#> [1] "paprika"    "petersilie" "radieschen"
#> 
#> [[27]]
#> [1] "erdbeeren" "erdbeeren" "koriander"
#> 
#> [[28]]
#> [1] "erdbeeren"  "erdbeeren"  "petersilie"
#> 
#> [[29]]
#> [1] "erdbeeren" "gurke"     "koriander"
#> 
#> [[30]]
#> [1] "erdbeeren"  "gurke"      "petersilie"
#> 
#> [[31]]
#> [1] "gurke"     "gurke"     "koriander"
#> 
#> [[32]]
#> [1] "gurke"      "gurke"      "petersilie"
#> 
#> [[33]]
#> [1] "koriander" "koriander" "koriander" "tomaten"  
#> 
#> [[34]]
#> [1] "koriander"  "koriander"  "petersilie" "tomaten"   
#> 
#> [[35]]
#> [1] "koriander"  "petersilie" "petersilie" "tomaten"   
#> 
#> [[36]]
#> [1] "petersilie" "petersilie" "petersilie" "tomaten"   
#> 
#> [[37]]
#> [1] "karotten"  "karotten"  "koriander" "koriander"
#> 
#> [[38]]
#> [1] "karotten"   "karotten"   "koriander"  "petersilie"
#> 
#> [[39]]
#> [1] "karotten"   "karotten"   "petersilie" "petersilie"
#> 
#> [[40]]
#> [1] "karotten"  "koriander" "koriander" "zucchini" 
#> 
#> [[41]]
#> [1] "karotten"   "koriander"  "petersilie" "zucchini"  
#> 
#> [[42]]
#> [1] "karotten"   "petersilie" "petersilie" "zucchini"  
#> 
#> [[43]]
#> [1] "koriander" "koriander" "zucchini"  "zucchini" 
#> 
#> [[44]]
#> [1] "koriander"  "petersilie" "zucchini"   "zucchini"  
#> 
#> [[45]]
#> [1] "petersilie" "petersilie" "zucchini"   "zucchini"  
#> 
#> [[46]]
#> [1] "karotten"  "koriander" "salat"     "salat"    
#> 
#> [[47]]
#> [1] "karotten"   "petersilie" "salat"      "salat"     
#> 
#> [[48]]
#> [1] "karotten"   "koriander"  "radieschen" "salat"     
#> 
#> [[49]]
#> [1] "karotten"   "petersilie" "radieschen" "salat"     
#> 
#> [[50]]
#> [1] "karotten"   "koriander"  "radieschen" "radieschen"
#> 
#> [[51]]
#> [1] "karotten"   "petersilie" "radieschen" "radieschen"
#> 
#> [[52]]
#> [1] "koriander" "salat"     "salat"     "zucchini" 
#> 
#> [[53]]
#> [1] "petersilie" "salat"      "salat"      "zucchini"  
#> 
#> [[54]]
#> [1] "koriander"  "radieschen" "salat"      "zucchini"  
#> 
#> [[55]]
#> [1] "petersilie" "radieschen" "salat"      "zucchini"  
#> 
#> [[56]]
#> [1] "koriander"  "radieschen" "radieschen" "zucchini"  
#> 
#> [[57]]
#> [1] "petersilie" "radieschen" "radieschen" "zucchini"  
#> 
#> [[58]]
#> [1] "erdbeeren" "koriander" "koriander" "salat"    
#> 
#> [[59]]
#> [1] "erdbeeren"  "koriander"  "petersilie" "salat"     
#> 
#> [[60]]
#> [1] "erdbeeren"  "petersilie" "petersilie" "salat"     
#> 
#> [[61]]
#> [1] "erdbeeren"  "koriander"  "koriander"  "radieschen"
#> 
#> [[62]]
#> [1] "erdbeeren"  "koriander"  "petersilie" "radieschen"
#> 
#> [[63]]
#> [1] "erdbeeren"  "petersilie" "petersilie" "radieschen"
#> 
#> [[64]]
#> [1] "gurke"     "koriander" "koriander" "salat"    
#> 
#> [[65]]
#> [1] "gurke"      "koriander"  "petersilie" "salat"     
#> 
#> [[66]]
#> [1] "gurke"      "petersilie" "petersilie" "salat"     
#> 
#> [[67]]
#> [1] "gurke"      "koriander"  "koriander"  "radieschen"
#> 
#> [[68]]
#> [1] "gurke"      "koriander"  "petersilie" "radieschen"
#> 
#> [[69]]
#> [1] "gurke"      "petersilie" "petersilie" "radieschen"
#> 
#> [[70]]
#> [1] "salat" "salat" "salat" "salat"
#> 
#> [[71]]
#> [1] "radieschen" "salat"      "salat"      "salat"     
#> 
#> [[72]]
#> [1] "radieschen" "radieschen" "salat"      "salat"     
#> 
#> [[73]]
#> [1] "radieschen" "radieschen" "radieschen" "salat"     
#> 
#> [[74]]
#> [1] "radieschen" "radieschen" "radieschen" "radieschen"
#> 
#> [[75]]
#> [1] "karotten"  "koriander" "koriander" "koriander" "koriander"
#> 
#> [[76]]
#> [1] "karotten"   "koriander"  "koriander"  "koriander"  "petersilie"
#> 
#> [[77]]
#> [1] "karotten"   "koriander"  "koriander"  "petersilie" "petersilie"
#> 
#> [[78]]
#> [1] "karotten"   "koriander"  "petersilie" "petersilie" "petersilie"
#> 
#> [[79]]
#> [1] "karotten"   "petersilie" "petersilie" "petersilie" "petersilie"
#> 
#> [[80]]
#> [1] "koriander" "koriander" "koriander" "koriander" "zucchini" 
#> 
#> [[81]]
#> [1] "koriander"  "koriander"  "koriander"  "petersilie" "zucchini"  
#> 
#> [[82]]
#> [1] "koriander"  "koriander"  "petersilie" "petersilie" "zucchini"  
#> 
#> [[83]]
#> [1] "koriander"  "petersilie" "petersilie" "petersilie" "zucchini"  
#> 
#> [[84]]
#> [1] "petersilie" "petersilie" "petersilie" "petersilie" "zucchini"  
#> 
#> [[85]]
#> [1] "koriander" "koriander" "koriander" "salat"     "salat"    
#> 
#> [[86]]
#> [1] "koriander"  "koriander"  "petersilie" "salat"      "salat"     
#> 
#> [[87]]
#> [1] "koriander"  "petersilie" "petersilie" "salat"      "salat"     
#> 
#> [[88]]
#> [1] "petersilie" "petersilie" "petersilie" "salat"      "salat"     
#> 
#> [[89]]
#> [1] "koriander"  "koriander"  "koriander"  "radieschen" "salat"     
#> 
#> [[90]]
#> [1] "koriander"  "koriander"  "petersilie" "radieschen" "salat"     
#> 
#> [[91]]
#> [1] "koriander"  "petersilie" "petersilie" "radieschen" "salat"     
#> 
#> [[92]]
#> [1] "petersilie" "petersilie" "petersilie" "radieschen" "salat"     
#> 
#> [[93]]
#> [1] "koriander"  "koriander"  "koriander"  "radieschen" "radieschen"
#> 
#> [[94]]
#> [1] "koriander"  "koriander"  "petersilie" "radieschen" "radieschen"
#> 
#> [[95]]
#> [1] "koriander"  "petersilie" "petersilie" "radieschen" "radieschen"
#> 
#> [[96]]
#> [1] "petersilie" "petersilie" "petersilie" "radieschen" "radieschen"
#> 
#> [[97]]
#> [1] "koriander" "koriander" "koriander" "koriander" "koriander" "koriander"
#> 
#> [[98]]
#> [1] "koriander"  "koriander"  "koriander"  "koriander"  "koriander"  "petersilie"
#> 
#> [[99]]
#> [1] "koriander"  "koriander"  "koriander"  "koriander"  "petersilie" "petersilie"
#> 
#> [[100]]
#> [1] "koriander"  "koriander"  "koriander"  "petersilie" "petersilie" "petersilie"
#> 
#> [[101]]
#> [1] "koriander"  "koriander"  "petersilie" "petersilie" "petersilie" "petersilie"
#> 
#> [[102]]
#> [1] "koriander"  "petersilie" "petersilie" "petersilie" "petersilie" "petersilie"
#> 
#> [[103]]
#> [1] "petersilie" "petersilie" "petersilie" "petersilie" "petersilie" "petersilie"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...