由于我一个月前对这个主题的上一个问题尚未完全回答,并且我缺少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))
我想要的输出(或类似的东西):
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))
奖金:理想情况下,我想填充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个。