R-数据表中的元素“;a「;匹配datatable的列名;b";内部列创建未识别为列名

R-数据表中的元素“;a「;匹配datatable的列名;b";内部列创建未识别为列名,r,class,data.table,R,Class,Data.table,我想在数据表中创建一个新列,使用类似于dt[,x:=y*z]的东西 但是,我使用的y来自另一个数据表的元素:dt2$xxx[1] 但似乎即使dt2$xxx[1]与dt中的列名匹配,R也无法识别dt2$xxx[1],并将其作为无法计算的因子输出 下面是一个虚拟示例: recipe = data.table(food = c("a", "b", "c", "d", "e", "a", "b", "c", "f", "g", "a", "c", "l", "k", "o"),

我想在数据表中创建一个新列,使用类似于
dt[,x:=y*z]
的东西

但是,我使用的
y
来自另一个数据表的元素:
dt2$xxx[1]

但似乎即使
dt2$xxx[1]
dt
中的列名匹配,R也无法识别
dt2$xxx[1]
,并将其作为无法计算的因子输出

下面是一个虚拟示例:

recipe = data.table(food = c("a", "b", "c", "d", "e", "a", "b", "c", "f", "g", "a", "c", "l", "k", "o"),
                    ingredient = c(rep("sugar",5), rep("water",5), rep("honey",5)),
                    value = c(1:15))

record = data.table(date = c(rep("2018-04-27", 10)),
                    a = c(sample(1:10, 10)),
                    b = c(sample(1:10, 10)))
record[,sugar:= recipe$food[1]*recipe$value[1] + recipe$food[2]*recipe$value[2]]
这就产生了一个错误,即因子不能进入计算,但我认为
recipe$food[1]
(即“a”)将被视为
record
中的一列,可以按列计算到函数中


我不明白背后的类属性以及如何解决这个问题,如果有人能帮助我,那就太棒了,谢谢

根据示例,我们可能需要

r1 <- dcast(recipe[food %in% names(record)[2:3]], ingredient ~ food)
record[, sugar := a * r1$a + b * r1$b]
2)使用
crossprod

for(i in seq_along(r1)) record[,(r1$ingredient[i]) :=  
   as.vector(as.matrix(.SD) %*% unlist(r1[i, nm1, with = FALSE])), .SDcols = nm1][]

欢迎来到StackOverflow,请遵循:如果没有一些数据,帮助您是非常困难的,甚至是不可能的。我得到了一个名为
dt
的数据,它至少有一个名为
z
的列,并希望生成一个名为
x
的新列,它是
z
乘以一个数字
y
的结果,该数字是data.table
dt2
的列
xxx
的第一个元素。是这样吗?如果是这样,请您分享一些虚拟数据,并至少显示
str(df)
str(df2)
?@PavoDive非常感谢您的回复!!是的,我的意思你是对的。我已经在问题中加入了虚拟示例,谢谢!谢谢你的回复,这个例子很有用。但是,很抱歉,我没有更清楚地说明情况,在实际情况中,有不止一种成分,我在示例中更新了这些成分。“在这种情况下,这会更加困难,对吗?”托马森为迟来的回应感到抱歉。我正忙着其他事情。你能查一下最新的答案吗允许我最后一次打扰你。。。我想直到现在,您都完全理解了我的意图:使用配料表匹配事务数据(以杯为单位记录)。然而,由于在实际情况中,食物的数量是丰富的(a、b、c、d等等),有没有一种编程的方式我可以为他们写最后一行?(a*r1$a[i]+b*r1$b[i])这项工作令人惊讶。。。。非常感谢你!!在这个平台上,除了将此标记为答案之外,我还有什么办法可以信任您吗?因为这是我发的第一个问题哈哈,非常感谢@托马森很高兴知道它对你有用。这就是我想要的,没有更多,没有更少:=)
nm1 <- names(record)[-1]
for(i in seq_along(r1)) record[, (r1$ingredient[i]) :=  Reduce(`+`, Map(`*`, .SD, 
           r1[i, nm1, with = FALSE])), .SDcols = nm1][]
for(i in seq_along(r1)) record[,(r1$ingredient[i]) :=  
   as.vector(as.matrix(.SD) %*% unlist(r1[i, nm1, with = FALSE])), .SDcols = nm1][]