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。同样,当分数高于99pctl
分数(此处未演示)时,应将其指定为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