gpt4 book ai didi

R data.table 点积与匹配的列名(每组)

转载 作者:行者123 更新时间:2023-12-02 11:18:12 24 4
gpt4 key购买 nike

我有一个数据数据表和一个拟合系数数据表。我想计算每一行的拟合值。

dt = data.table(a = rep(c("x","y"), each = 5), b = rnorm(10), c = rnorm(10), d = rnorm(10))
coefs = data.table(a = c("x","y"), b = c(0, 1), d = c(2,3))
dt
# a b c d
# 1: x -0.25174915 -0.2130797 -0.67909764
# 2: x -0.35569766 0.6014930 0.35201386
# 3: x -0.31600957 0.4398968 -1.15475814
# 4: x -0.54113762 -2.3497952 0.64503654
# 5: x 0.11227873 0.0233775 -0.96891456
# 6: y 1.24077566 -1.2843439 1.98883516
# 7: y -0.23819626 0.9950835 -0.17279980
# 8: y 1.49353589 0.3067897 -0.02592004
# 9: y 0.01033722 -0.5967766 -0.28536224
#10: y 0.69882444 0.8702424 1.24131062

coefs # NB no "c" column
# a b d
#1: x 0 2
#2: y 1 3

对于 dt 中的每个 a=="x" 行,我想要 0*b+2*d ;对于 dt 中的每个 a=="y" 行,我想要 1*b+3*d

有没有对列名进行硬编码的数据表方法?我很高兴将列名放在变量 cols = colnames(coefs)[-1] 中。

很容易将 group 和 rbind 一起循环,所以如果分组造成问题,请忽略那部分。

最佳答案

加入data.tables:

dt[coefs, res := b * i.b + d * i.d, on = "a"]
# a b c d res
#1: x 0.09901786 -0.362080111 -0.5108862 -1.0217723
#2: x -0.16128422 0.169655945 0.3199648 0.6399295
#3: x -0.79648896 -0.502279345 1.3828633 2.7657266
#4: x -0.26121421 0.480548972 -1.1559392 -2.3118783
#5: x 0.54085591 -0.601323442 1.3833795 2.7667590
#6: y 0.83662761 0.607666970 0.6320762 2.7328562
#7: y -1.92510391 -0.050515610 -0.3176544 -2.8780671
#8: y 1.65639926 -0.167090105 0.6830158 3.7054466
#9: y 1.48772354 -0.349713539 -1.2736467 -2.3332166
#10: y 1.49065993 0.008198885 -0.1923361 0.9136516

通常你会在这里使用矩阵乘积,但这意味着你必须将相应的子集强制转换为矩阵。这将导致进行复制,并且由于 data.tables 主要用于较大的数据,因此您希望避免复制。

如果您需要动态列名,想到的最简单的解决方案实际上是 eval/ parse构造:
cols = colnames(coefs)[-1]
expr <- parse(text = paste(paste(cols, paste0("i.", cols), sep = "*"), collapse = "+"))
#expression(b*i.b+d*i.d)

dt[coefs, res := eval(expr), on = "a"]

也许其他人可以提出更好的解决方案。

这是使用矩阵乘法的解决方案:
dt[, res := as.matrix(.SD) %*% unlist(coefs[a == .BY, .SD, .SDcols = cols]), 
by = "a", .SDcols = cols]

当然,这会产生副本,这可能比 eval 效率低解决方案。

关于R data.table 点积与匹配的列名(每组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38744160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com