Вы можете попробовать один из следующих ...
Обратите внимание, что я использовал data.frame
вместо того, matrix
вы получаете с cbind
:
PLRank <- data.frame(Season, Team, End.Rank)
С "data.table":
library(data.table)
setDT(PLRank)[, l.End.Rank := shift(End.Rank), by = .(Team)][]
# Season Team End.Rank l.End.Rank
# 1: 1 Diverpool 8 NA
# 2: 1 Deverton 17 NA
# 3: 2 Diverpool 4 8
# 4: 2 Deverton 15 17
# 5: 3 Diverpool 3 4
# 6: 3 Deverton 6 15
# 7: 4 Diverpool 4 3
# 8: 4 Deverton 16 6
# 9: 5 Diverpool 3 4
# 10: 5 Deverton 17 16
Или, с "dplyr":
library(dplyr)
PLRank %>%
group_by(Team) %>%
mutate(l.End.Rank = lag(End.Rank))
# Source: local data frame [10 x 4]
# Groups: Team [2]
#
# Season Team End.Rank l.End.Rank
# (dbl) (fctr) (dbl) (dbl)
# 1 1 Diverpool 8 NA
# 2 1 Deverton 17 NA
# 3 2 Diverpool 4 8
# 4 2 Deverton 15 17
# 5 3 Diverpool 3 4
# 6 3 Deverton 6 15
# 7 4 Diverpool 4 3
# 8 4 Deverton 16 6
# 9 5 Diverpool 3 4
# 10 5 Deverton 17 16
Update
я честно совершенно неправильно, что вы хотели это сгруппированы по сезону.
Если вы отстаете от сезона, возможно, вам стоит рассмотреть возможность расширения данных, чтобы каждый сезон имел только один ряд. Тогда отставание по сезону было бы легко.
Примеры:
Здесь мы используем dcast
от «data.table» распространить значения «End.Rank» из «ТИМ». Затем мы отстаем только от вновь созданных столбцов.
library(data.table)
teams <- as.character(unique(PLRank$Team))
dcast(as.data.table(PLRank), Season ~ Team, value.var = "End.Rank")[
, (teams) := lapply(.SD, shift), .SDcols = teams][]
# Season Deverton Diverpool
# 1: 1 NA NA
# 2: 2 17 8
# 3: 3 15 4
# 4: 4 6 3
# 5: 5 16 4
Или, если вы хотите как названия команд и значения, чтобы быть в широком виде, вы можете попробовать что-то вроде:
dcast(as.data.table(PLRank)[, ind := sequence(.N), by = Season],
Season ~ ind, value.var = c("Team", "End.Rank"))[
, c("End.Rank_1", "End.Rank_2") := lapply(.SD, shift),
.SDcols = c("End.Rank_1", "End.Rank_2")][]
# Season Team_1 Team_2 End.Rank_1 End.Rank_2
# 1: 1 Diverpool Deverton NA NA
# 2: 2 Diverpool Deverton 8 17
# 3: 3 Diverpool Deverton 4 15
# 4: 4 Diverpool Deverton 3 6
# 5: 5 Diverpool Deverton 4 16
подход в «dplyr» похож. Поскольку вы идете в широкую форму, вам также нужно «tidyr» для загрузки.
library(dplyr)
library(tidyr)
PLRank %>%
spread(Team, End.Rank) %>%
mutate_each(funs(lag), -Season)
# Season Deverton Diverpool
# 1 1 NA NA
# 2 2 17 8
# 3 3 15 4
# 4 4 6 3
# 5 5 16 4
Спасибо! Быстрый вопрос о вашем ответе 'dpylr': как код знает, чтобы отставать от сезона? –
@MattBarger, С Новым Годом! Пожалуйста, ознакомьтесь с моим обновлением и дайте мне знать, если он более полезен для вас. – A5C1D2H2I1M1N2O1R2T1
Спасибо Ананде. У меня есть другие переменные, поэтому я хотел бы сохранить данные в одном столбце.Я предполагаю, что я могу 'spread()', lag, а затем 'gather()' для того же эффекта, правда, верно? –