【问题标题】:Split vector intro more vectors with constrains将向量拆分为更多带有约束的向量
【发布时间】:2017-03-31 22:05:57
【问题描述】:

我正在制定膳食计划,我需要一些关于如何将每日摄入量分成几餐的建议。

我有一个向量,其中每个元素代表一个人应该吃的不同食物的克数,以满足他/她每天摄入的蛋白质、碳水化合物、脂肪、纤维等。

矢量看起来像这样:

intake <-  Salmon                 Chicken                   Pesto                  Butter 
         162.573720               96.262731               48.415283                4.560707 
            Yoghurt                Couscous              Boiled Egg                   Apple 
         190.233090              518.741711              198.049714                0.000000 
            Avocado                Broccoli              Grapefruit Quark / Kesella Natural 
           0.000000              350.000000                0.000000              217.450103 
            Oatmeal 
          67.820707 

这个长度是 13。 我还有一个矩阵 X,其中包含每种食物类型的所有营养成分,如下所示:

        Salmon Chicken   Pesto Butter Yoghurt Couscous Boiled Egg  Apple Avocado Broccoli Grapefruit
protein   0.18   0.231 0.12740  0.004  0.0342   0.0379     0.1225 0.0000  0.0194   0.0350      0.007
fat       0.12   0.010 0.53850  0.820  0.0300   0.0016     0.0973 0.0005  0.1960   0.0027      0.001
carbs     0.00   0.000 0.04080  0.005  0.0484   0.2182     0.0040 0.1058  0.0170   0.0312      0.070
fibre     0.00   0.000 0.00218  0.000  0.0000   0.0140     0.0000 0.0232  0.0475   0.0310      0.019
Greens    0.00   0.000 0.00000  0.000  0.0000   0.0000     0.0000 0.0000  1.0000   1.0000      0.000
        Quark / Kesella Natural Oatmeal
protein                   0.127   0.133
fat                       0.001   0.070
carbs                     0.036   0.576
fibre                     0.000   0.100
Greens                    0.000   0.000

最后,我有 (0/1)- 表示食物来源是否被视为“早餐”的向量。 “午餐”、“晚餐”和“小吃”也是如此。

我想将向量“摄入量”拆分为一个人全天吃的饭菜。我的第一个想法是简单地采用摄入*早餐的点积来获得所有被认为是早餐的食物,然后吃掉它们。这种方法不能给出非常合理的答案,因为它可能会让位于早餐吃很多食物而剩下的饭菜几乎没有剩下的食物。

假设有人一天吃 5 顿饭;

我想将摄入向量拆分为 5 个单独的向量,将被视为早餐的食物放入新的早餐向量中。 另外,我希望能够调整每个向量中每种食物的数量:例如

默认值(早餐 50% 或更低蛋白质、10% 脂肪或更高、40% 碳水化合物或更低、晚间小吃 70% 蛋白质或更低、25% 脂肪或更高、5% 碳水化合物或更低)。

这样我就可以调整,以便一个人在早餐吃大量蛋白质和大量碳水化合物,然后再锻炼。

【问题讨论】:

  • 如果我们能看到输出应该是什么样子的模型,这将对我们有所帮助
  • 偶然发现了这个,link 可能你会感兴趣

标签: r if-statement vector


【解决方案1】:

当您说 50% 蛋白质时,我不确定您希望我们如何量化。您如何衡量营养蛋白质与非蛋白质食物的价值? 50% 或更少的蛋白质意味着相对于西兰花多少鸡肉?我对营养知之甚少。

另外,我必须重新输入你的所有数据,所以这里是为那些试图解决这个问题的人/当我在澄清后回来的时候。在您的数据集上使用 dput() 并将输出复制并粘贴到编辑中,以使您的工作更易于我们使用。

Foods <- c("Salmon", "Chicken","Pesto","Butter","Yoghurt","Couscous","Boiled Egg","Apple","Avocado","Broccoli","Grapefruit","Quark / Kesella Natural","Oatmeal")

intake <- c(162.573720, 96.262731, 48.415283, 4.560707, 190.233090, 518.741711, 198.049714, 0.00000, 0.0000, 350.00000, 0.00000, 217.450103, 67.820707)
names(intake) <- Foods
intake

nutrition <- data.frame(protein = c(0.18, 0.231, 0.12740, 0.004, 0.0342, 0.0379, 0.1225, 0.0000, 0.0194, 0.0350, 0.007, 0.127, 0.133), fat = c(0.12, 0.010, 0.53850, 0.820, 0.0300, 0.0016, 0.0973, 0.0005, 0.1960, 0.0027, 0.001, 0.001, 0.070), carbs = c(0.00,0.000, 0.04080, 0.005, 0.0484, 0.2182, 0.0040, 0.1058, 0.0170, 0.0312, 0.070, 0.036, 0.576), fibre = c(0, 0, 0.0218, 0, 0, 0.0140, 0, 0.0232, 0.0475, 0.0310, 0.019, 0.0, 0.1), greens = c(0,0,0,0,0,0,0,0,1,1,0,0,0), row.names = Foods)
nutrition

# constraints
#Breakfast 
#protein*.5 # maximum
#fat*.1 # minimum
#carbs*.4 # maximum

#Evening Snack 
#protein*.7 # maximum
#fat*.25 # minimum
#carbs*.5 #maximum

Breakfast <- c(0,1,0,0,1,0,1,1,1,0,1,1,1)
Lunch <- c(1,1,1,1,0,1,0,0,0,1,1,1,1)
Dinner <- c(1,1,0,0,0,1,0,0,1,0,0,1,0)
meals <- cbind(Breakfast, Lunch, Dinner)

# even split amongst meals
apply(meals, 2, function(x) 
  intake[which(x == 1)] / rowSums(split(cbind(intake, nutrition, meals), x)$`1`[,colnames(meals)]))

现在你说的困难部分是如何根据营养/膳食食物的相对份数进行非均匀拆分。 克与服务的比例是多少,所以我们知道这个人得到多少蛋白质?似乎我们需要这样才能使摄入量与营养信息一起发挥作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    相关资源
    最近更新 更多