我有两个数据集:一个数据集具有带有产品成分(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
中的逗号分隔值需要转置为矩阵,但是我不确定如何组合m
和ingred
来获得所需的输出。谢谢您的帮助!
答案 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