计算测量值之间的增量,同时在R中的各行中保持相同的单位



我有两个类似的数据帧

MEASUREMENT <- c("Length","Width","Breadth","Height") 
MULTIPLIER <-  c(1,0.1,1000,1)
df1 <- data.frame(MEASUREMENT,MULTIPLIER)
INPUT_MEASUREMENT <- c("Length","Length","Breadth","Breadth","Height")
INPUT_AVERAGE <- c(4.3,4.2,0.001,0.003,7)
INPUT_TARGET <- c(4,4,0.005,0.005,10)
OUTPUT_MEASUREMENT <- c("Breadth","Breadth","Length","Width","Height")
OUTPUT_AVERAGE <- c(0.006,0.011,6.8,68,9)
OUTPUT_TARGET <- c(0.005,0.005,6,60,10)
df2 <- data.frame(INPUT_MEASUREMENT,INPUT_AVERAGE,INPUT_TARGET,
OUTPUT_MEASUREMENT,OUTPUT_AVERAGE,OUTPUT_TARGET)

我试图在df2中创建两列DELTA_AVERAGEDELTA_TARGET,它们分别是(输出-输入(平均值和目标值的绝对值。由于每个测量都在不同的范围内,所以在计算德尔塔平均值和目标值之前,我想使用df1中的乘数列来进行相应的测量,这样得到的数据帧在所有行中都具有相同的单元。

我想要的输出是

INPUT_MEASUREMENT INPUT_AVERAGE INPUT_TARGET OUTPUT_MEASUREMENT OUTPUT_AVERAGE OUTPUT_TARGET DELTA_AVERAGE
Length         4.300        4.000            Breadth          0.006         0.005           1.7
Length         4.200        4.000            Breadth          0.011         0.005           6.8
Breadth         0.001        0.005             Length          6.800         6.000           5.8
Breadth         0.003        0.005              Width         68.000        60.000           3.8
Height         7.000       10.000             Height          9.000        10.000           2.0
DELTA_TARGET
1
1
1
1
0

我试着这样做,但没有得到正确的

input.df <- unique(merge(df1, df2[c("INPUT_MEASUREMENT")], 
by.x="MEASUREMENT", by.y="INPUT_MEASUREMENT"))
output.df <- unique(merge(df1, df2[c("OUTPUT_MEASUREMENT")], 
by.x="MEASUREMENT", by.y="OUTPUT_MEASUREMENT"))
library(dplyr)
df3 <- df2 %>%  
mutate(DELTA_AVERAGE = abs((OUTPUT_AVERAGE * output.df$MULTIPLIER) - 
(INPUT_AVERAGE * input.df$MULTIPLIER)),
DELTA_TARGET = abs((OUTPUT_TARGET * output.df$MULTIPLIER) - 
(INPUT_TARGET* input.df$MULTIPLIER)))

有人能给我指正确的方向吗?

这里的"诀窍"是制作df1的两个副本并重命名列:

# create data
df1 <- data.frame(
measurement = c("Length","Width","Breadth","Height"),
multiplier  = c(1,0.1,1000,1),
stringsAsFactors = FALSE
)
df2 <- data.frame(
input_measurement = c("Length","Length","Breadth","Breadth","Height"),
input_average = c(4.3,4.2,0.001,0.003,7),
input_target = c(4,4,0.005,0.005,10),
output_measurement = c("Breadth","Breadth","Length","Width","Height"),
output_average = c(0.006,0.011,6.8,68,9),
output_target = c(0.005,0.005,6,6,10),
stringsAsFactors = FALSE
)
# copy and rename df1 so can be merged as both input and output
df1_input <- df1
names(df1_input) <- c("input_measurement", "input_multiplier")
df1_output <- df1
names(df1_output) <- c("output_measurement", "output_multiplier")
# merge df1 onto df2 twice (once for input, once for output)
df2 <- merge(df2, df1_input,  by="input_measurement")
df2 <- merge(df2, df1_output, by="output_measurement")
# calculate deltas
df2$delta_average <- df2$output_average * df2$output_multiplier - df2$input_average * df2$input_multiplier
df2$delta_target  <- df2$output_target  * df2$output_multiplier - df2$input_target  * df2$input_multiplier

最新更新