1

我有两个数据框。其中一个具有不同 ID 的代码(1 或 -1)。

data.1 <- read.csv(text = "
IDs qt1 qt2 qt3
pl1 -1 -1 -1
pl2 1 -1 1
pl3 1 1 1
pl4 -1 -1 -1
pl5 1 1 1
pl6 1 1 1
pl7 1 -1 1
pl8 1 1 1 
pl9 -1 -1 -1
pl0 -1 -1 -1
")

并有另一个数据框,其中包含三个变量、参数和估计值。

Data.2 <- read.csv(text = "
variable parameter estimate
varA a0 2.3
varA a1 0.859
varA a2 0.527
varA a3 0.774
VarB b0 19.08
VarB b1 0.412
VarB b2 0.022
VarB b3 0.448
VarC c0 5.4
VarC c1 0.492
VarC c2 0.094
VarC c3 0.971
")

对于每个 ID,我需要估计每个变量的值。例如,对于 pl1 和 VarA,我需要计算的值是 a0 + (a1*qt1) + (a2*qt2) + (a3*qt3)。

每个 ID 的预期结果是这样的:

在此处输入图像描述

当然,这是一个模拟示例,我有数百个 ID 和变量。因此,我需要一些自动的方法来做到这一点。我正在探索选项dplyr::rowwise并尝试编写一个函数,但找不到制作合理代码的方法。

任何帮助将非常感激。

谢谢

4

2 回答 2

0

您可以按行拆分 qt 值并插入 1 作为第一个值,按变量拆分估计值,然后相乘和求和:

qt_vals <- split(cbind(qt0 = 1, data.1[-1]), f = data.1$IDs)
vals <- split(Data.2$estimate, f = Data.2$variable)

sapply(vals, function(x) sapply(qt_vals, function(y) sum(x * y)))

     varA   VarB  VarC
pl0 0.140 18.198 3.843
pl1 0.140 18.198 3.843
pl2 3.406 19.918 6.769
pl3 4.460 19.962 6.957
pl4 0.140 18.198 3.843
pl5 4.460 19.962 6.957
pl6 4.460 19.962 6.957
pl7 3.406 19.918 6.769
pl8 4.460 19.962 6.957
pl9 0.140 18.198 3.843

请注意,您pl10在图像中但pl0在示例数据中,这是图像与上述结果之间差异的来源。

于 2020-06-18T23:50:21.407 回答
0

考虑在稍微重塑为宽格式后数据帧之间的交叉连接合并。然后,在没有任何循环的情况下运行您指定的计算。

# ADD COLUMN + RESHAPE WIDE
wide_data.2 <- reshape(transform(data.2, var_letter=gsub("[a-z]", "", parameter)), 
                       idvar = "variable", v.names = "estimate",  drop = "parameter",
                       timevar = "var_letter", direction = "wide")

# CROSS JOIN MERGE + CALCULATION
merge_data <- within(merge(wide_data.2, data.1, by=NULL), {
        calc_value <- estimate.0 + (estimate.1*qt1) + (estimate.2*qt2) + (estimate.3*qt3)
})

# RESHAPE WIDE
wide_merge_data <- reshape(merge_data[c("IDs", "calc_value", "variable")], 
                           idvar = "IDs", v.names = "calc_value", 
                           timevar = "variable", new.row.names = 1:nrow(data.1),
                           direction = "wide")
wide_merge_data 

#    IDs calc_value.VarA calc_value.VarB calc_value.VarC
# 1  pl1           0.140          18.198           3.843
# 2  pl2           3.406          19.918           6.769
# 3  pl3           4.460          19.962           6.957
# 4  pl4           0.140          18.198           3.843
# 5  pl5           4.460          19.962           6.957
# 6  pl6           4.460          19.962           6.957
# 7  pl7           3.406          19.918           6.769
# 8  pl8           4.460          19.962           6.957
# 9  pl9           0.140          18.198           3.843
# 10 pl0           0.140          18.198           3.843
于 2020-06-19T02:05:47.557 回答