我正试图找到一个公式,让我能够找到一组中每个变量(分数…(的最低值,以便应用这个公式:
relative_score1=[团队得分1-(表现最差的团队得分1(总体(]/[(每组团队的最大得分1(例如仅针对"A"组((-表现最差团队得分1
我的数据框架具有以下结构,具有多个分数。。。。1、2、3以及多个组。
data <- data.frame(team= c("blue", "green", "red", "pink", "grey", "black", "rose", "darkblue", "golden", "silver") , group = c("A","A", "B", "C", "D", "D", "D", "F", "F", "F" ), score1 = c(18, 22, 21, 22, 45, 18, 22, 21, 22, 45), score2= c(10, 20, 21, 92, 40, 18, 20, 21, 20, 45), score3 = c(10, 20, 30, 40, 50, 60, 70, 80, 95, 95))
我需要将这个公式应用于许多";分数";在我的数据帧中;组";这就是为什么我试图创建一个公式,而不是单独计算。
我知道如何让表现最差的球队得分1(总得分(,最差的2分<-函数(x({最小值(x,na.rm=T(}但我一直在努力让每个团队都能获得最佳表现的价值。公式的这一部分[(每组球队的最高得分为1(例如仅针对"A"组((
到目前为止,我已经成功地制作了这个
test <- function(y, score, data) {
max.score <- max(data[data$group == y, ]$score, na.rm=T)
max.score
}
当我用特定的名称(例如score1(指定$score时,它是有效的,但当我将值替换为"0"时,它就不起作用了;x〃"z";或者任何其他可以帮助我创建函数的值。
#not working for "score1"
test <- function(y, z, data) {
max.score <- max(data[data$group == y, ]$z, na.rm=T)
max.score
}
max= test( y= "A", z="score1", data = data)
如有任何帮助或建议,我们将不胜感激!!
尝试这种索引样式。来自@GregorThomas的好建议。好吧,您正在使用$
来调用变量。这就是更改名称产生问题的地方。只需通过放置[[z]]
而不是$z
来进行这个细微的更改。这将调用所需的变量。这里的代码:
#Function
test <- function(y, z, data) {
max.score <- max(data[data$group == y, ][[z]], na.rm=T)
max.score
}
#Apply
max= test( y= "A", z="score1", data = data)
输出:
max
[1] 22
根据我对您的公式的最佳理解,这里有一种dplyr
/tidyr
方法:将数据转换为长格式,进行分组计算,再转换回宽格式:
library(dplyr)
library(tidyr)
data %>%
pivot_longer(cols = starts_with("score"), names_to = "score_number", values_to = "score") %>%
group_by(score_number) %>%
mutate(min_overall = min(score)) %>%
group_by(group, score_number) %>%
mutate(rel = (score - min_overall) / (max(score) - min_overall)) %>%
pivot_wider(id_cols = c(team, group), names_from = score_number, values_from = c(score, rel))
# # A tibble: 10 x 8
# # Groups: group [5]
# team group score_score1 score_score2 score_score3 rel_score1 rel_score2 rel_score3
# <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 blue A 18 10 10 0 0 0
# 2 green A 22 20 20 1 1 1
# 3 red B 21 21 30 1 1 1
# 4 pink C 22 92 40 1 1 1
# 5 grey D 45 40 50 1 1 0.667
# 6 black D 18 18 60 0 0.267 0.833
# 7 rose D 22 20 70 0.148 0.333 1
# 8 darkblue F 21 21 80 0.111 0.314 0.824
# 9 golden F 22 20 95 0.148 0.286 1
# 10 silver F 45 45 95 1 1 1