提前为这篇长文道歉;我对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的方法。
以下是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))
发布于 2018-07-30 03:55:49
使用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
下面是另一个使用expand.grid
和match
的base R
选项
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
相乘。
发布于 2018-07-30 03:33:46
创建合并键,然后执行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
https://stackoverflow.com/questions/51583716
复制相似问题