我有以下棒球比赛参赛样本数据框:
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和管道来实现结果。
答案 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