R:根据 group_by 函数的运行值从单独的数据帧获取值

问题描述 投票:0回答:1

我有以下数据框。

Col1 = c("A1", "A1", "A2", "A2")
Col2 = c("B1", "B1", "B2", "B2")
Value = c("10", "20", "30", "40")
df = data.frame(Col1, Col2, Value)

这是一个包含各种观察结果的数据框。两个因子列和一个值列。同一组观测值可以有多行具有不同的值。有多个具有类似观察结果的此类数据框。

MinCol1 = c("A1", "A2")
MinCol2 = c("B1", "B2")
MinValue = c("1", "1")
mins = data.frame(MinCol1, MinCol2, MinValue)

MaxCol1 = c("A1", "A2")
MaxCol2 = c("B1", "B2")
MaxValue = c("100", "100")
maxes = data.frame(MaxCol1, MaxCol2, MaxValue)

以上两个数据帧是所有数据帧(如第一个数据帧)中所有组(Col1 和 Col2)的最小值和最大值。

我想标准化数据帧的值,例如每组的第一个数据帧。我希望新值是 [0,1],但我希望对从最小值和最大值数据帧中获取的范围进行标准化。

normalizeDataForAllBenchmarks = function(df, mins, maxes) {
    
    ### Normalize metrics [0,1]
    df_normal = df %>% group_by(Process, Category, Metric) %>%
        mutate(Value = rescale(Value, to = c(0,1), from = range(...)))
}

我有上面的函数包,我不确定范围函数中的内容,以便对每组的最小值和最大值数据帧进行查找。

r dplyr group-by range rescale
1个回答
0
投票

您需要做的就是通过 ids 连接数据,然后计算范数:

library(tidyverse)

normalizeDataForAllBenchmarks = function(df, mins, maxes) {
    left_join(df, mins, by = c("Col1" = "MinCol1", "Col2" = "MinCol2"))|>
    left_join(maxes, by = c("Col1" = "MaxCol1", "Col2" = "MaxCol2")) |>
    mutate(across(Value:MaxValue, as.numeric),
           Value = (Value - MinValue)/(MaxValue-MinValue))|>
    select(-c(MinValue, MaxValue))
}

normalizeDataForAllBenchmarks(df, mins, maxes)
#>   Col1 Col2      Value
#> 1   A1   B1 0.09090909
#> 2   A1   B1 0.19191919
#> 3   A2   B2 0.29292929
#> 4   A2   B2 0.39393939
© www.soinside.com 2019 - 2024. All rights reserved.