使用R中的foverlaps选择得分最高的范围ID
我想使用foverlaps从一个单独的列中选择数量最大的范围ID,在一个值位于重叠范围之间的设置中。虽然我非常熟悉软件包的基本设置,但我找不到执行上述功能的方法 这里有一个小例子使用R中的foverlaps选择得分最高的范围ID,r,dataframe,data.table,R,Dataframe,Data.table,我想使用foverlaps从一个单独的列中选择数量最大的范围ID,在一个值位于重叠范围之间的设置中。虽然我非常熟悉软件包的基本设置,但我找不到执行上述功能的方法 这里有一个小例子 >df1 AthleteID Distance Athlete1 5 Athlete2 10 Athlete3 25 >df2 CheckpointID Start End Score Checkpoint1 1 8 2 Checkpoint2 7
>df1
AthleteID Distance
Athlete1 5
Athlete2 10
Athlete3 25
>df2
CheckpointID Start End Score
Checkpoint1 1 8 2
Checkpoint2 7 12 4
Checkpoint3 9 15 6
Checkpoint4 16 26 8
Checkpoint5 20 30 10
根据上面的说明,最终的data.frame应该是这样的
>df1
AthleteID Distance Score CheckpointID
Athlete1 5 2 Checkpoint1
Athlete2 10 6 Checkpoint3
Athlete3 25 10 Checkpoint5
>df1
AthleteID Distance Score CheckpointID
Athlete1 5 2 Checkpoint1
Athlete2 10 7 Checkpoint3
Athlete3 25 11 Checkpoint5
=========================
编辑
最后一个问题;我还想知道如何根据运动员ID在相同的时间间隔内使用不同的检查点分数
>df2
CheckpointID AthleteID Start End Score
Checkpoint1 Athlete1 1 8 2
Checkpoint2 Athlete1 7 12 4
Checkpoint3 Athlete1 9 15 6
Checkpoint4 Athlete1 16 26 8
Checkpoint5 Athlete1 20 30 10
Checkpoint1 Athlete2 1 8 3
Checkpoint2 Athlete2 7 12 5
Checkpoint3 Athlete2 9 15 7
Checkpoint4 Athlete2 16 26 9
Checkpoint5 Athlete2 20 30 11
Checkpoint1 Athlete3 1 8 1
Checkpoint2 Athlete3 7 12 3
Checkpoint3 Athlete3 9 15 5
Checkpoint4 Athlete3 16 26 7
Checkpoint5 Athlete3 20 30 11
最后的结果是这样的
>df1
AthleteID Distance Score CheckpointID
Athlete1 5 2 Checkpoint1
Athlete2 10 6 Checkpoint3
Athlete3 25 10 Checkpoint5
>df1
AthleteID Distance Score CheckpointID
Athlete1 5 2 Checkpoint1
Athlete2 10 7 Checkpoint3
Athlete3 25 11 Checkpoint5
你可以这样使用foverlaps。关键是复制df1中的距离列,以创建一个开始等于结束的人工间隔。然后,对于[Distance,Distance2=Distance]在df2的[Start,End]范围内的行,使用foverlaps连接df1和df2,并只保留最后一个匹配。
图书馆数据表
df1:运动员1 5 5
>2:运动员2 10 10
>3:运动员3 25
y必须输入foverlaps
setkeydf2,开始,结束
使用type in和mult last,然后选择column
foverlapsdf1,df2,by.x=cDistance,Distance2,mult=last,type=in[,.AthleteID,Distance,Score,CheckpointID]
>AthleteID距离分数检查点ID
>1:运动员1 5 2检查点1
>2:运动员2 10 6检查点3
>3:运动员3 25 10检查点5
删除df1中的临时列
df1[,距离2:=NULL]
您还可以使用新实现的非equi联接来实现它,这应该更简单
y[x, on = .(Start <= Distance, End >= Distance), mult = "last",
.(AthleteID, Distance, Score, CheckpointID)]
谢谢你的回复。在选择最佳答案并结束此问题之前,我做了一个小编辑,请查看!谢谢你的回复。在选择最佳答案并结束此问题之前,我做了一个小编辑,请查看!