根据解决方案变量创建类似某种列联表的列

时间:2019-03-20 14:23:55

标签: r function dataframe

由于我一个月前对这个主题的上一个问题尚未完全回答,并且我缺少1个声誉点以增加赏金,因此我决定再次提出一些补充信息。

-

我有一个商店清单,有一个产品(苹果)。我运行了一个线性方程组,以获取列“ var”;此值表示您将收到或必须给其他商店的苹果数量。我不知道如何从中创建一个“可操作的数据框”。我无法找出正确的用语来正确解释我想要的内容,因此希望在下面对您有所帮助:

数据:

df <- data.frame(store = c('a', 'b', 'c', 'd', 'e', 'f'), 
                 sku = c('apple', 'apple', 'apple', 'apple', 'apple', 'apple'), 
                 var = c(1,4,-6,-1,5,-3))

enter image description here

我想要的输出(或类似的东西):

output <- data.frame(store = c('a', 'b', 'c', 'd', 'e', 'f'), sku = c('apple', 'apple', 'apple', 'apple', 'apple', 'apple'), var = c(1,4,-6,-1,5,-3), ship_to_a = c(0,0,1,0,0,0), ship_to_b = c(0,0,4,0,0,0), ship_to_c = c(0,0,0,0,0,0), ship_to_d = c(0,0,0,0,0,0), ship_to_e = c(0,0,1,1,0,3), ship_to_f = c(0,0,0,0,0,0))

enter image description here

奖金:理想情况下,我想填充ship_to_store列,直到sum(df $ var)的总和不等于零时所有(-)减值都变为“ gone”。

此功能是由另一个用户创建的:

fun <- function(DF){
  n <- nrow(DF)
  mat <- matrix(0, nrow = n, ncol = n)
  VAR <- DF[["var"]]
  neg <- which(DF[["var"]] < 0)
  for(k in neg){
    S <- 0
    Tot <- abs(DF[k, "var"])
    for(i in seq_along(VAR)){
      if(i != k){
        if(VAR[i] > 0){
          if(S + VAR[i] <= Tot){
            mat[k, i] <- VAR[i]
            S <- S + VAR[i]
            VAR[i] <- 0
          }else{
            mat[k, i] <- Tot - S
            S <- Tot
            VAR[i] <- VAR[i] - Tot + S
          }
        }
      }
    }
  }
  colnames(mat) <- paste0("ship_to_", DF[["store"]])
  cbind(DF, mat)
}

该函数在我上面的特定示例中有效,但是在所有情况下均不起作用,因为它没有保存每个商店已接收的苹果数量,因此导致商店接收的苹果过多。 例如:

df <- data.frame(store = c('a', 'b', 'c', 'd', 'e')
                 sku = c('apple', 'apple', 'apple', 'apple', 'apple')
                 var = c(-44,-151,100,52,43))

输出中有商店B提供100个苹果来存储C,将商店44个苹果提供给C。这使得144个而不是应该得到的100个。

0 个答案:

没有答案