【发布时间】:2017-11-11 03:15:52
【问题描述】:
我想检查一个数据帧(“apx”)中是否有任何行,其中 apx 中“AD”列中的条目与另一个数据帧(“npx”)中“AD”列中的条目匹配,并且,其中匹配行中的 SD 条目与另一行相差 13 个单位。
我已经检查了几个关于 SO 的不同参考资料,但由于我需要构建第三个数据框(以及其他原因)而找不到答案。
我的工作试验是这样的......
npx <- data.frame(TN = c(111, "Z2", 4, "fox", 34256, 4782, "ZGJU45"),
SD=c( 100, 200, 100, 600, 500, 115, 455),
AD=c( "34YY", "37PD", "123M", "235W", "37PD", "123M", "1WW"))
apx <- data.frame(TN = c(222, "X34", 5, "bear", 47789, 37281, "VF456"),
SD = c(101, 201, 310, 450, 515, 660, 505),
AD = c("123M", "23XY", "5S S", "1WW", "27 30R", "14M", "37PD"))
注意:AD 条目“123M”、“1WW”和“37PD”出现在 apx 和 npx 中。其中第一个和第三个在 npx 中出现了两次。
保险因素改为字符:
i <- sapply(apx, is.factor)
apx[i] <- lapply(apx[i], as.character)
i <- sapply(npx, is.factor)
npx[i] <- lapply(npx[i], as.character)
我的第五次尝试...(强制 SD 条目为整数)...
test5 <- apx[which(apx$AD == npx$AD &
as.integer(npx$SD) - as.integer(apx$SD) < 13)
%in% as.integer(npx$SD), ]
我之前的一个尝试......
test3 <- apx[which(apx$AD == npx$AD &
as.integer(npx$SD) - as.integer(apx$SD) < 13)
%in% setequal(npx$SD, apx$SD), ]
我在第三个数据框中寻找的是....
TN SD AD
[1] 222 101 123M
因为 123M(apx 的第一行)在 npx 的第三行中找到,并且 SD 的对应条目彼此相距在 13 个单位以内(100 和 101);但是,在 npx 中第二次出现 123M(在第六行)时,SD 的相应条目之间的差异是 15 个单位。实际上,我只寻找那些 npx 中的 SD 条目比 apx 中相应的 SD 条目大
[2] bear 450 1WW
因为 1WW(apx 的第 4 行)位于 npx 的最后一行,并且 SD 的相应条目彼此相距 13 个单位(450 和 455)。
[3] VF456 505 37PD
虽然在 npx 的第二行中找到 37PD(apx 的最后一行),但该条目的质量不符合 37PD,因为相应的 SD 值相隔超过 13 个单位(200 和 505);但是,npx(第 5 行)中另一个出现的 37PD 对应的 SD 条目彼此相差 13 个单位,因此有资格出现在结果数据帧中的 37PD。
我咬牙切齿地期待有人向我展示一个非常简单的方法来做到这一点,但宁愿忍受这种尴尬也不要旋转更多的轮子。提前致谢。
【问题讨论】: