Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中复制excel解算器_R_Function_Solver - Fatal编程技术网

在R中复制excel解算器

在R中复制excel解算器,r,function,solver,R,Function,Solver,我想知道是否有一个简单的函数可以解决R中的以下问题: 假设我有以下数据帧: 变量“A”的值为c(10、35、90) 变量“B”的值为c(3、4、17、18、50、40、3) 现在我知道B中各种值的总和等于A中的值,例如“3+4+3=10”和“17+18=35”,这两个值在整个数据集中总是平衡的 问题 是否有一个函数可以通过反复试验,将这些值相加到B中,并将正确相加的值与a相匹配?例如,函数尝试求3+4+18之和,即25,然后重试,因为25不是a中的值 我自己也尝试过几种解决方案,但我经常遇到

我想知道是否有一个简单的函数可以解决R中的以下问题:

假设我有以下数据帧:

  • 变量“A”的值为c(10、35、90)
  • 变量“B”的值为c(3、4、17、18、50、40、3)
现在我知道B中各种值的总和等于A中的值,例如“3+4+3=10”和“17+18=35”,这两个值在整个数据集中总是平衡的

问题

是否有一个函数可以通过反复试验,将这些值相加到B中,并将正确相加的值与a相匹配?例如,函数尝试求3+4+18之和,即25,然后重试,因为25不是a中的值

我自己也尝试过几种解决方案,但我经常遇到的一个问题是A的观察值总是比B少

如果有人能在这里帮助我,我将非常感激!如果需要更多信息,请让我知道

干杯

大安

编辑

此示例使用简化的数字。实际上,它是一个大型数据集,因此我正在寻找一个可扩展的解决方案


再次感谢

您可以尝试以下方法,但我很抱歉,这是不可扩展的。 对于您拥有的3个summand的情况

x <- expand.grid(c(3, 4, 17, 18, 50, 40, 3),#building a matrix of the possible combinations of summands
                 c(3, 4, 17, 18, 50, 40, 3),
                 c(3, 4, 17, 18, 50, 40, 3))
x$sums <-rowSums(x) #new column with possible sums
idx<- x$sums%in%c(10, 35, 90) #checking the sums are in the required total
x[idx,]

        Var1 Var2 Var3 sums
2      4    3    3   10
8      3    4    3   10
14     3    4    3   10
44     4    3    3   10
50     3    3    4   10
56     3    3    4   10
92     3    3    4   10
98     3    3    4   10
296    4    3    3   10
302    3    4    3   10
308    3    4    3   10
338    4    3    3   10

x这是一个被称为的问题,网上有很多关于如何使用动态规划或贪婪算法来解决这个问题的例子

为了给您一个正确的答案,包
adagio
有一个实现:

library(adagio)

sums = c(10, 35, 90)
values = c(3, 4, 17, 18, 50, 40, 3)


for(i in sums){
  #we have to subset the values to be less than the value
  #otherwise the function errors:
  print(subsetsum(values[values < i], i))
}
library(慢板)
总和=c(10,35,90)
数值=c(3,4,17,18,50,40,3)
(i)(合计){
#我们必须将值子集为小于该值
#否则,函数错误:
打印(子项(值[值

每个总和的输出都是一个列表,其中包含val和数组中的索引,因此您可以根据需要整理输出。

Hi Chriss,非常感谢您的快速响应!我认为这确实是一个明智的做法。不幸的是,我的“真实”数据集规模很大,这使得手动网格搜索很困难。我正在尝试找出是否有一种方法可以使用您的解决方案并使其具有可扩展性。嗨,Jeremy,非常感谢您的回答,这肯定会有所帮助。你知道这是不是可以升级?我的“真实”数据集有更多的值,这并不像我给出的示例那样简单。这意味着我无法键入所有值,这将成为一个问题,因为变量a中存在NA,并且您无法将NA更改为0,因为这将在该特定函数中产生错误。它应该是可伸缩的,其思想是将数据作为数据帧导入,并将函数应用于数据的每一行,先把它清理一下。确切的方法取决于您的数据,以及您希望它如何输出
library(adagio)

sums = c(10, 35, 90)
values = c(3, 4, 17, 18, 50, 40, 3)


for(i in sums){
  #we have to subset the values to be less than the value
  #otherwise the function errors:
  print(subsetsum(values[values < i], i))
}