使用带有布尔值的查找表计算R中的变量

时间:2019-07-19 16:28:59

标签: r

我有两个数据集:一个数据集具有带有产品成分(m的二分变量)和一个查找表,该查询表使用布尔值将成分映射到产品标签(例如,成分是否为TRUE或合并多个变量后的FALSE

例如,m可能类似于:

id    milk  cheese eggs
001   TRUE  TRUE   FALSE
002   FALSE FALSE  TRUE
003   FALSE FALSE  FALSE

然后,查找表ingred看起来像:

label            boolean  ingredients
vegan            FALSE    milk, cheese, eggs
gluten_free      FALSE    wheat, rye, barley

期望的输出是m将包含一个新字段,该字段将成分的布尔值(由列名表示)与查找表中的逗号分隔值匹配后合并TRUE/FALSE

id    milk  cheese eggs   wheat   barely  rye    vegan   gluten_free
001   TRUE  TRUE   FALSE  FALSE   FALSE   FALSE  FALSE   TRUE
002   FALSE FALSE  TRUE   FALSE   TRUE    FALSE  FALSE   FALSE
003   FALSE FALSE  FALSE  TRUE    FALSE   FALSE  TRUE    FALSE

我通常认为ingred中的逗号分隔值需要转置为矩阵,但是我不确定如何组合mingred来获得所需的输出。谢谢您的帮助!

1 个答案:

答案 0 :(得分:3)

一个base R选项将用定界符(", ")将第二个数据集的“成分”列拆分为list个向量,使用Map循环在list以及'boolean'列的相应元素上,根据拆分后的名称对第一个数据集的列进行子集设置,检查其是否等于'boolean'值,进行逐行{{1 }}并取反(sum

!

数据

df1[df2$label] <- Map(function(x, y) !rowSums(df1[x] != y), 
               strsplit(df2$ingredients, ", "), df2$boolean)

df1
#  id  milk cheese  eggs wheat barley   rye vegan gluten_free
#1  1  TRUE   TRUE FALSE FALSE  FALSE FALSE FALSE        TRUE
#2  2 FALSE  FALSE  TRUE FALSE   TRUE FALSE FALSE       FALSE
#3  3 FALSE  FALSE FALSE  TRUE  FALSE FALSE  TRUE       FALSE