у меня два dataframes
. Первая (games
) показывает для каждой из нескольких игр год и то, какой игрок достиг определенных неопределенных целей (player1
, player2
, player3
). Второй (rankings
) показывает рейтинг каждого игрока в данном году.
Моя цель - добавить столбец данных games
, указывающий средний рейтинг всех игроков, достигших этих целей в каждой игре.
Воспроизводимый пример:
set.seed(0)
players <- c("Abe", "Bob", "Chris", "John", "Jane", "Linda", "Mason", "Zoe", "NA")
years <- c(2000:2005)
season <- sample(years, 20, replace = TRUE)
player1 <- sample(players, 20, replace = TRUE)
player2 <- sample(players, 20, replace = TRUE)
player3 <- sample(players, 20, replace = TRUE)
games <- data.frame(season, player1, player2, player3, stringsAsFactors = FALSE)
rankings <- data.frame(replicate(6,sample(1:5,8,rep=TRUE)))
colnames(rankings) <- years
ranked_players <- players[-9]
rankings <- cbind(ranked_players, rankings)
games
- это первый dataframe
, показывающий год игры (season
), который был player1
, кто был player2
, а кто был player3
. Не всегда игрок для всех категорий для всех игр.
rankings
- это второе dataframe
, показывающее рейтинг от 1 до 5 каждого игрока в данном году.
Я хочу рассчитать рейтинг игрока, который сыграл соответственно player1
, player2
и player3
для каждой игры в играх, и усреднить эти рейтинги.
Чтобы рассчитать рейтинг, я попробовал эту функцию:
calc_ranking <- function(x, y) {
z <- select(filter(rankings, ranked_players==x), c(y))
z <- as.integer(z[1,1])
z
}
Видимо, работает. Теперь я должен применить его для каждого игрока, который играл в игры в играх, и для каждого года.
Я пробовал этот цикл:
new_col <- mapply(calc_ranking, games$player1, games$season)
но это не работает. Это дает мне ошибку
Error in inds_combine(.vars, ind_list) : Position must be between 0 and n
Однако, даже если это сработало, с этим решением я должен повторить цикл 3 раза, чтобы создать 3 столбца, по одному для каждой роли как player1
, player2
и player3
, а затем создать столбец, который я действительно хочу (средний из 3 столбцов). Я подозреваю, что есть более эффективный способ сделать это без повторения цикла (при условии, что я могу это исправить)? Это было бы очень полезно, потому что в моем реальном наборе данных у меня 13 «ролей», для которых мне нужно вычислить рейтинг.
Надеюсь, этот второй вопрос лучше моего первого. Извиняюсь за любую ошибку, я только 1 неделю изучаю R (это мой первый опыт работы с кодированием в целом).
Большое спасибо!