加速R在数据帧上的应用

加速R在数据帧上的应用,r,performance,apply,R,Performance,Apply,我有一个赛马比赛。对于每一项赛马记录,如果赛道值没有丢失,我想统计过去两年中在相同场地、赛道和类似距离的赛马中获胜的数量。我使用apply循环每一行 我只想在原始数据集中添加一个新的列count previous win,这样输出应该有一个以上的列,并且与给定的输入具有相同的行长度。但是速度很慢。如何加速循环 rdate:赛马年-月-日。 地点:圣彼得堡。 赛道:草地,全天候赛道。 距离:1200、1400、1600、1800等。 得胜:0(马未获得第一名),1(马获得第一名) 结构, 1751

我有一个赛马比赛。对于每一项赛马记录,如果赛道值没有丢失,我想统计过去两年中在相同场地、赛道和类似距离的赛马中获胜的数量。我使用apply循环每一行 我只想在原始数据集中添加一个新的列count previous win,这样输出应该有一个以上的列,并且与给定的输入具有相同的行长度。但是速度很慢。如何加速循环

rdate:赛马年-月-日。 地点:圣彼得堡。 赛道:草地,全天候赛道。 距离:1200、1400、1600、1800等。 得胜:0(马未获得第一名),1(马获得第一名)

结构, 17510, 17517, 17532, 17566, 17593, 17615, 17629, 17657, 17667, 17796, 17817, 17839, 17856, 17860, 17881, 17881, 17902, 17902 ),class=“Date”),地点=c(“HV”、“ST”、“ST”、“ST”、“ST”、“ST”, “ST”、“ST”、“ST”、“ST”、“ST”、“ST”、“ST”、“HV”、“ST”、“ST”、“ST”、“ST”、“HV”, “ST”、“ST”、“ST”、“ST”、“ST”、“ST”),轨道=c(“草皮”、“草皮”、“草皮”, “草皮”、“草皮”、“草皮”、“草皮”、“草皮”、“草皮”、“草皮”、“草皮”、“草皮”, “草皮”、“草皮”、“草皮”、“草皮”、“草皮”、“草皮”、“草皮”、“草皮”、“草皮”, “草皮”,“草皮”,“草皮”,horsenum=c(“A366”,“A366”,“A366”, “A366”、“A366”、“A366”、“A366”、“A366”、“A366”、“A366”、“A366”、“A366”、“A366”, “A366”、“A366”、“B440”、“B440”、“B440”、“A366”、“B440”、“A366”, “B440”、“A366”、“B440”),距离=c(1800L、1800L、1600L、1600L, 1800L,1600L,1800L,1800L,1800L,1600L,1800L,2000L,1800L, 1200L、1400L、1400L、1650L、1400L、1600L、1400L、1800L、1400L ),ind_win=c(0升,0升,0升,0升,0升,0升,0升,0升,0升,0升,0升, 0L,0L,0L,0L,0L,1L,0L,0L,0L,1L)),row.names=c(NA,-22L ),class=“data.frame”) 图书馆(tidyverse) 图书馆(lubridate) HWinCountF=as.integer(df[“距离])-200& 距离(0){ 返回(nrow(tmp[tmp$ind_-win==1,])) }否则{ 返回(NA) } }否则{ 返回(NA) } } jc.数据['h_win_count']每个OP的需求

我想数一数过去两年在相同场地、赛道和相似距离的赛马比赛中获胜的次数

<> P>因为这是一个直接聚合,避免循环,考虑到数据帧本身的“代码>子集< /代码>,请考虑<代码>合并/<代码>,因为你需要互相观察。然后运行
aggregate
以获得马的胜利。下面运行已发布的数据示例

# MERGE BY COMMON VARIABLES AND SUBSET RESULTS BY DATE AND DISTANCE
compare_df <- subset(merge(jc.data, jc.data, by=c("horsenum", "venue", "track")),
                     rdate.x < rdate.y &
                     rdate.x > lubridate::ymd(rdate.y) - lubridate::years(2) &
                     distance.x >= as.integer(distance.y) - 200 &
                     distance.x <= as.integer(distance.y) + 200 
              )

# SUM ind_win GROUPED BY COMMON VARIABLES
agg_df <- aggregate(cbind(h_win_count = ind_win.x) ~ horsenum + venue + track, 
                    data = compare_df, FUN=sum)

agg_df
#   horsenum venue track h_win_count
# 1     A366    HV  TURF           0
# 2     A366    ST  TURF           0
# 3     B440    ST  TURF           2
#按公共变量合并,按日期和距离子集结果
比较润滑油:ymd(rdate.y)-润滑油:年(2)&
距离.x>=as.integer(距离.y)-200&

distance.x如果您包含一个简单的示例输入和所需的输出,可以用来测试和验证可能的解决方案,那么就更容易帮助您了。与@Parfait相同:谢谢您的帮助,我运行了您的代码,但我只想在原始数据集中添加一个新的列计数previous win count,因此,输出应该与给定的输入具有相同的变量和行长度,并且还有一个列countSimply
merge
agg\u df到新列的原始数据帧:
final\u df
# MERGE BY COMMON VARIABLES AND SUBSET RESULTS BY DATE AND DISTANCE
compare_df <- subset(merge(jc.data, jc.data, by=c("horsenum", "venue", "track")),
                     rdate.x < rdate.y &
                     rdate.x > lubridate::ymd(rdate.y) - lubridate::years(2) &
                     distance.x >= as.integer(distance.y) - 200 &
                     distance.x <= as.integer(distance.y) + 200 
              )

# SUM ind_win GROUPED BY COMMON VARIABLES
agg_df <- aggregate(cbind(h_win_count = ind_win.x) ~ horsenum + venue + track, 
                    data = compare_df, FUN=sum)

agg_df
#   horsenum venue track h_win_count
# 1     A366    HV  TURF           0
# 2     A366    ST  TURF           0
# 3     B440    ST  TURF           2