创建一个函数来获得R中每组的最大值



我正试图找到一个公式,让我能够找到一组中每个变量(分数…(的最低值,以便应用这个公式:

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    

最新更新