提前为长篇道歉;我是R的这一部分的新手,所以我不知道该如何总结问题。
我有一个“基线结果”的数据框,看起来像这样
Circuit Voltage Power
A 1 1
B 1 3
C 1 5
还有一个像这样的缩放模型
Voltage Scaled_Power
1.0 1.00
0.9 0.75
0.8 0.50
此缩放模型来自表格,而不来自lm
之类的任何函数。该模型从本质上说:“如果新电压== 0.9,则将基准功率缩放0.75”。缩放模型与“电路”无关,但是需要特定“电路”的基准功率才能计算新功率。我要实现的最终结果是:
Circuit Voltage Power
A 1.0 1.00
B 1.0 3.00
C 1.0 5.00
A 0.9 0.75
B 0.9 2.25
C 0.9 3.75
A 0.8 0.50
B 0.8 1.50
C 0.8 2.50
,即一个新数据框,其中包含第一个数据框的“电路”和第二个数据框的“电压”的所有组合(我知道我可以使用expand.grid
来完成此操作),但是新列为“功率”,它应用了比例因子。
这听起来像是通常解决的模式,所以我猜想解决方案必须已经存在?
到目前为止,我已经尝试了以下方法
expand.grid(Circuit = df_base$Circuit,Voltage = scaling_model$Voltage) %>%
left_join(df_base) %>%
left_join(scaling_model)
Circuit Voltage Power Scaled_Power
A 1.0 1 1.00
B 1.0 3 1.00
C 1.0 5 1.00
A 0.9 NA 0.75
B 0.9 NA 0.75
C 0.9 NA 0.75
A 0.8 NA 0.50
B 0.8 NA 0.50
C 0.8 NA 0.50
但是然后我需要一些函数来从行中选择一个特定的值(例如Excel的VLOOKUP)来进行乘法运算,而且我不确定这是解决问题的最R ish方法。
这是MWE的代码
library(dplyr)
scaling_model <-
data.frame(
Voltage = c(1.0, 0.9, 0.8),
Scaled_Power = c(1.0, 0.75, 0.5))
df_base <- data.frame(
Circuit = factor(c("A", "B", "C")),
Voltage = c(1.0, 1.0, 1.0),
Power = c(1.0, 3.0, 5.0))
df_result <-
data.frame(
Circuit = factor(c("A", "B", "C", "A", "B", "C", "A", "B", "C")),
Voltage = c(1.0, 1.0, 1.0, 0.9, 0.9, 0.9, 0.8, 0.8, 0.8),
Power = c(1.0, 3.0, 5.0,
1.0 * 0.75, 3.0 * 0.75, 5.0 * 0.75,
1.0 * 0.5, 3.0 * 0.5, 5.0 * 0.5))
答案 0 :(得分:2)
有了dplyr
,您可以做到
library(dplyr)
expand.grid(Circuit = df_base$Circuit,
Voltage = scaling_model$Voltage) %>%
left_join(scaling_model) %>%
left_join(df_base[c("Circuit", "Power")]) %>%
mutate(Power = Scaled_Power * Power) %>%
select(-Scaled_Power)
# Circuit Voltage Power
#1 A 1.0 1.00
#2 B 1.0 3.00
#3 C 1.0 5.00
#4 A 0.9 0.75
#5 B 0.9 2.25
#6 C 0.9 3.75
#7 A 0.8 0.50
#8 B 0.8 1.50
#9 C 0.8 2.50
这里是另一个base R
选项,它使用expand.grid
和match
df_result <- expand.grid(Circuit = df_base$Circuit,
Voltage = scaling_model$Voltage)
df_result$Power <- df_base$Power * scaling_model$Scaled_Power[match(df_result$Voltage, scaling_model$Voltage)]
df_result
match找到df_result$Voltage
中scaling_model$Voltage
的位置,然后我们将结果用于scaling_model$Scaled_Power
的子集(即展开),最后乘以df_base$Power
。
答案 1 :(得分:1)
创建一个合并键,然后执行merge
scaling_model$mergekey=1
df_base$mergekey=1
newdf=merge(scaling_model,df_base[,c('Circuit','mergekey','Power')],by='mergekey')
newdf$Scaled_Power=newdf$Scaled_Power*newdf$Power
newdf
mergekey Voltage Scaled_Power Circuit Power
1 1 1.0 1.00 A 1
2 1 1.0 3.00 B 3
3 1 1.0 5.00 C 5
4 1 0.9 0.75 A 1
5 1 0.9 2.25 B 3
6 1 0.9 3.75 C 5
7 1 0.8 0.50 A 1
8 1 0.8 1.50 B 3
9 1 0.8 2.50 C 5