Парное манипулирование строками в data.frame - PullRequest
0 голосов
/ 05 июля 2018

У меня есть данные о нескольких тысячах американских баскетболистов за несколько лет.

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

df <- data.frame(id = c(rep(1:4, times=2), 1), 
             year = c(1, 1, 2, 2, 3, 4, 4, 4,5),
             team = c(1,2,3,4, 2,2,4,4,2),
             position = c(1,2,3,4,1,1,4,4,4))
> df
  id year team position
1  1    1    1        1
2  2    1    2        2
3  3    2    3        3
4  4    2    4        4
5  1    3    2        1
6  2    4    2        1
7  3    4    4        4
8  4    4    4        4
9  1    5    2        4

Какой эффективный способ манипулировать df в new_df ниже?

> new_df
  id move time position.1 position.2 year.1 year.2
1  1    0    2          1          1      1      3
2  2    1    3          2          1      1      4
3  3    0    2          3          4      2      4
4  4    1    2          4          4      2      4
5  1    0    2          1          4      3      5

В new_df первое вхождение баскетболиста сравнивается со вторым вхождением, записывается, поменялся ли игрок командами и сколько времени потребовалось игроку, чтобы сделать это.

Примечание:

  • В реальных данных некоторые баскетболисты встречаются более двух раз и могут играть за несколько команд и на нескольких позициях.

  • В таком случае добавляется новая строка в new_df, которая сравнивает каждое дополнительное вхождение игрока только с предыдущим вхождением.

Редактировать: я думаю, что это не очень простое reshape упражнение, из-за причин, упомянутых в предыдущих двух предложениях. Чтобы прояснить это, я добавил дополнительное вхождение идентификатора игрока 1 к фиктивным данным.

Любая помощь приветствуется и ценится!

Ответы [ 3 ]

0 голосов
/ 05 июля 2018
s=table(df$id)
df$time=rep(1:max(s),each=length(s))
df1 = reshape(df,idvar = "id",dir="wide")
transform(df1, move=+(team.1==team.2),time=year.2-year.1)

 id year.1 team.1 position.1 year.2 team.2 position.2 move time
1  1      1      1          1      3      2          1    0    2
2  2      1      2          2      4      2          1    1    3
3  3      2      3          3      4      4          4    0    2
4  4      2      4          4      4      4          4    1    2
0 голосов
/ 06 июля 2018

Этот кусок кода добился цели, используя data.table

#transform to data.table
dt <- as.data.table(df)          

#sort on year  
setorder(dt, year, na.last=TRUE) 

#indicate the names of the new columns          
new_cols= c("time", "move", "prev_team", "prev_year", "prev_position")


#set up the new variables
dtt[ , (new_cols) := list(year - shift(year),team!= shift(team), shift(team), shift(year), shift(position)), by = id]

# select only repeating occurrences
dtt <- dtt[!is.na(dtt$time),]

#outcome
dtt
   id year team position time  move prev_team prev_year prev_position
1:  1    3    2        1    2  TRUE         1         1             1
2:  2    4    2        1    3 FALSE         2         1             2
3:  3    4    4        4    2  TRUE         3         2             3
4:  4    4    4        4    2 FALSE         4         2             4
5:  1    5    2        4    2 FALSE         2         3             1
0 голосов
/ 05 июля 2018

Код ниже должен помочь вам добраться до точки, где данные транспонируются Вам нужно будет создать переменные перемещения и времени

df <- data.frame(id = rep(1:4, times=2), 
                 year = c(1, 1, 2, 2, 3, 4, 4, 4),
                 team = c(1, 2, 3, 4, 2, 2, 4, 4),
                 position = c(1, 2, 3, 4, 1, 1, 4, 4))

library(reshape2)
library(data.table)

setDT(df) #convert to data.table
df[,rno:=rank(year,ties="min"),by=.(id)] #gives the occurance

#creating the transposed dataset
Dcast_DT<-dcast(df,id~rno,value.var = c("year","team","position"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...