#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