Вычисление частоты значений в строках (вычисление количества первых, вторых и третьих мест в таблице рейтингов)

#r #frequency

#r #частота

Вопрос:

У меня есть фрейм данных для спортивной лиги (фактические данные составляют ~ 70 команд и ~ 10 игр):

 data <- data.frame(team = c("a","b","c","d"),
                   g1_placement = c(1,2,3,4), 
                   g2_placement = c(1,3,4,2),
                   g3_placement = c(2,1,4,3))
 

Где team название команды, g*_placement расположение команд в играх 1-3:

   team g1_placement g2_placement g3_placement
1    a            1            1            2
2    b            2            3            1
3    c            3            4            4
4    d            4            2            3
 

Я хочу рассчитать количество первых, вторых и третьих мест для каждого раза, конечный результат будет:

   team g1_placement g2_placement g3_placement first second third
1    a            1            1            2     2      1     0
2    b            2            3            1     1      1     1
3    c            3            4            4     0      0     1
4    d            4            2            3     0      1     1
 

Ответ №1:

Вы можете получить данные в длинном формате, count каждую позицию для каждого team , сохранить только 1-е 3 значения и снова получить данные в широком формате.

 library(dplyr)
library(tidyr)

data %>%
  inner_join(data %>%
  pivot_longer(cols = ends_with('_placement')) %>%
  count(team, value) %>%
  filter(value %in% 1:3) %>%
  mutate(value = c('first', 'second', 'third')[value]) %>%
  pivot_wider(names_from = value, values_from = n, values_fill = 0), by = 'team')

#  team g1_placement g2_placement g3_placement first second third
#1    a            1            1            2     2      1     0
#2    b            2            3            1     1      1     1
#3    c            3            4            4     0      0     1
#4    d            4            2            3     0      1     1
 

Ответ №2:

Вот код уже для 10 игр, обратите внимание на 4-й столбец, который отсутствует в ваших результатах, потому что вы его пропустили.

 tmp=do.call(rbind,
  by(data[,-1],list(data$team),function(x){
    sapply(1:10,function(y){sum(x==y)})
  })
)
colnames(tmp)=paste0(1:ncol(tmp),rep(c("st","nd","rd","th"),c(rep(1,3),ncol(tmp)-3)))

cbind(data,tmp)
    
  team g1_placement g2_placement g3_placement 1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10th
a    a            1            1            2   2   1   0   0   0   0   0   0   0    0
b    b            2            3            1   1   1   1   0   0   0   0   0   0    0
c    c            3            4            4   0   0   1   2   0   0   0   0   0    0
d    d            4            2            3   0   1   1   1   0   0   0   0   0    0