R 按3个值合并(两个指定值,一个在一个范围内)

R 按3个值合并(两个指定值,一个在一个范围内),r,merge,R,Merge,对不起,这个半复杂的标题。希望我能证明我在这里得到了什么。我有以下数据帧(从实际数据简化): 我想得到: DF3 ID Year Grade Season Score Pctl A 2016 6 Fall 259 1 B 2017 7 Fall 264 9 C 2016 6 Fall 263 1 D 2018 6 Winter 269

对不起,这个半复杂的标题。希望我能证明我在这里得到了什么。我有以下数据帧(从实际数据简化):

我想得到:

DF3
ID  Year    Grade   Season  Score   Pctl
A   2016    6        Fall    259     1
B   2017    7        Fall    264     9
C   2016    6        Fall    263     1
D   2018    6        Winter  269     6.5
E   2016    8        Spring  277     3
简单地说,考虑到DF1中的季节、等级和分数,我想从DF2中附加相应的Pctl。我知道在大多数情况下,这与使用
merge()
并提供指定的“by”参数一样简单

然而,尽管季节和等级无缝地合并,因为它们有精确的对应值,但分数并不总是如此

首先,以ID“A”为例。他们的分数是259分,低于
等级:6
季节:秋季
分数:261
。在这种情况下,我希望将
pctl
指定为1。同样,当分数高于99
pctl
分数(此处未演示)时,应将其指定为99

第二个并发症是ID“C”,其
得分为263
,介于
Pctl
1和2之间。也就是说,它不是1:1映射。当这种情况发生时,我只想四舍五入(向上或向下,只要它是一致的)到最近的分数,并提供
Pctl
。为了本演示的目的,我四舍五入并添加了
Pctl
1


从我的研究来看,这似乎可以通过条件连接或使用
基因组范围
软件包来实现,但我不清楚解决方案。

A
数据。表
方法:

library(data.table)

setkey(setDT(DF1), Grade, Season, Score)
setkey(setDT(DF2), Grade, Season, Score)

DF3 <- DF2[DF1, roll = "nearest"]
然而,你也提到了第99百分位

另一件事是,可能确实存在正好介于两个值之间的分数,例如,下面428的
分数,其中另一个表仅包含427和429。在这种情况下,百分位数将始终与较低的百分位数匹配

数据:

DF1

   ID Year Grade Season Score
1:  A 2016     6   Fall   259
2:  B 2017     7   Fall   264
3:  C 2016     6   Fall   263
4:  D 2018     6 Winter   269
5:  E 2016     8 Spring   277
6:  F 2017     7 Spring   550
7:  G 2015     6   Fall   428

DF2

   Grade Season Score Pctl
1:     6   Fall   261  1.0
2:     6   Fall   264  2.0
3:     7   Fall   264  9.0
4:     8 Spring   267  5.0
5:     6 Winter   269  6.5
6:     8 Spring   277  3.0
7:     7 Spring   550 99.6
8:     6   Fall   427 84.0
9:     6   Fall   429 88.0
添加第99百分位的行:

library(data.table)

setkey(setDT(DF1), Grade, Season, Score)
setkey(setDT(DF2), Grade, Season, Score)

DF3 <- DF2[DF1, roll = "nearest"][Pctl > 99, Pctl := 99]

您确定预期的输出是正确的吗?例如,264分不应该是9分,因为它属于秋季和7年级吗?你说得对,我来编辑。谢谢你的关注,可能是包模糊加入-嗨,安德鲁,谢谢你的建议。我不熟悉fuzzyjoin包,但使用过dplyr。我在使用
difference\u left\u join
时遇到的问题是,它只接受数值,因此除了分数之外,它不能接受诸如“Grade”和“seasure”之类的字符串参数。
DF1

   ID Year Grade Season Score
1:  A 2016     6   Fall   259
2:  B 2017     7   Fall   264
3:  C 2016     6   Fall   263
4:  D 2018     6 Winter   269
5:  E 2016     8 Spring   277
6:  F 2017     7 Spring   550
7:  G 2015     6   Fall   428

DF2

   Grade Season Score Pctl
1:     6   Fall   261  1.0
2:     6   Fall   264  2.0
3:     7   Fall   264  9.0
4:     8 Spring   267  5.0
5:     6 Winter   269  6.5
6:     8 Spring   277  3.0
7:     7 Spring   550 99.6
8:     6   Fall   427 84.0
9:     6   Fall   429 88.0
library(data.table)

setkey(setDT(DF1), Grade, Season, Score)
setkey(setDT(DF2), Grade, Season, Score)

DF3 <- DF2[DF1, roll = "nearest"][Pctl > 99, Pctl := 99]
DF3

   Grade Season Score Pctl ID Year
1:     6   Fall   259  1.0  A 2016
2:     6   Fall   263  2.0  C 2016
3:     6   Fall   428 84.0  G 2015
4:     6 Winter   269  6.5  D 2018
5:     7   Fall   264  9.0  B 2017
6:     7 Spring   550 99.0  F 2017
7:     8 Spring   277  3.0  E 2016