Как назначить каждому экземпляру фактора определенное значение c? - PullRequest
0 голосов
/ 11 февраля 2020

Скажем, у меня есть фрейм данных, который выглядит следующим образом:

 playerID    yearID salary
1 abbotje01   1998 175000
2 abbotje01   1999 255000
3 abbotje01   2000 255000
4 abbotje01   2001 300000
5 abbotku01   1993 109000
6 abbotku01   1994 109000
.
.
.

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

 playerID    yearID salary
1 abbotje01   1998 300000
2 abbotje01   1999 300000
3 abbotje01   2000 300000
4 abbotje01   2001 300000
5 abbotku01   1993 109000
6 abbotku01   1994 109000

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

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

После группировки по 'playerID', получите индекс max значение 'yearID', чтобы извлечь соответствующую ему 'зарплату' и обновите столбец 'salary' с помощью mutate

library(dplyr)
df1 %>%
     group_by(playerID) %>%
      mutate(salary = salary[which.max(yearID)])
# A tibble: 6 x 3
# Groups:   playerID [2]
#  playerID  yearID salary
#  <chr>      <int>  <int>
#1 abbotje01   1998 300000
#2 abbotje01   1999 300000
#3 abbotje01   2000 300000
#4 abbotje01   2001 300000
#5 abbotku01   1993 109000
#6 abbotku01   1994 109000

Или используя data.table

library(data.table)
setDT(df1)[, salary := salary[which.max(yearID)], playerID]

data

df1 <- structure(list(playerID = c("abbotje01", "abbotje01", "abbotje01", 
"abbotje01", "abbotku01", "abbotku01"), yearID = c(1998L, 1999L, 
2000L, 2001L, 1993L, 1994L), salary = c(175000L, 255000L, 255000L, 
300000L, 109000L, 109000L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))
0 голосов
/ 11 февраля 2020

Мы можем order фрейм данных на основе yearID и затем извлечь последние salary из каждой группы.

Это можно сделать в базе R

df <- df[with(df, order(playerID, yearID)), ]
df$final_salary <- with(df, ave(salary, playerID, FUN = function(x) x[length(x)]))
#Also
#df$final_salary <- with(df, ave(salary, playerID, FUN = function(x) tail(x, 1)))

df

#   playerID yearID salary final_salary
#1 abbotje01   1998 175000       300000
#2 abbotje01   1999 255000       300000
#3 abbotje01   2000 255000       300000
#4 abbotje01   2001 300000       300000
#5 abbotku01   1993 109000       109000
#6 abbotku01   1994 109000       109000

В dplyr

library(dplyr)
df %>%
  arrange(playerID, yearID) %>%
  group_by(playerID) %>%
  mutate(final_salary = last(salary))

и data.table

library(data.table)

setDT(df)
df[order(yearID), final_salary := last(salary), playerID]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...