使用组

时间:2018-03-13 18:19:00

标签: r dplyr

我有以下棒球比赛参赛样本数据框:

team <- rep("SFG", 6)
attendance <- seq(1000:1005)
year <- c(2000, 2000, 2001, 2001, 2002, 2002)
dates <- as.Date(c("2000-01-01", "2000-01-02", "2001-01-03", "2001-01-04", "2002-02-05", "2002-03-06"))

df <- data.frame(team, attendance, year, dates)

我想创建两个新列。

第一个是一个名为“opening_day”的简单二进制变量,表示(1或0)游戏是否是一年中的第一个游戏。

第二个将被称为“opening_day_attendance”,并将包含第一个游戏的出勤号码。换句话说,2000年的所有行都将参加今年的第一场比赛。

如果可能的话,我想通过dplyr和管道实现这一目标。

非常感谢!

编辑:其他人已经注意到这是一个可能重复的问题,虽然它通常类似于上面提到的问题,但是对于另一个问题的大多数答案A)不要在原始数据集中创建新列。值和B)不要使用dplyr和管道来实现结果。

2 个答案:

答案 0 :(得分:1)

这是一个明显重复的问题。你可以试试这个:

library(data.table)
df <- data.table(team, attendance, year, dates)
df[,opening_day:=ifelse(dates==min(dates),1,0), by=year]
df[,opening_day_attendance:=attendance[dates==min(dates)], by=year]

答案 1 :(得分:1)

我建议创建一个包含最小日期的单独数据框,因为我想您的实际数据将包含多个团队:

require(doBy)
mins       <- summaryBy(dates ~ team, data = df, FUN = min, keep.names = TRUE)
mins$dates <- as.Date(mins$dates, origin = '1970-01-01')

> mins
  team      dates
1  SFG 2000-01-01

然后,您可以将原始数据合并到此数据框中,以隔离每个团队的第一个游戏的游戏信息:

mins <- merge(mins, df, by = c('team', 'dates'), all.x = TRUE)

> mins
  team      dates attendance year
1  SFG 2000-01-01          1 2000