我想检查一个数据帧(“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
因为在 npx 的第三行中找到了 123M(apx 的第一行),并且 SD 的对应条目彼此在 13 个单位内(100 和 101);但是,在 npx 中第二次出现 123M 时(在第 6 行),SD 的相应条目之间的差异相距 15 个单位。实际上,我只是在寻找那些 npx 中的 SD 条目比 apx 中的相应 SD 条目大(仅)< 13 的那些实例。
[2] bear 450 1WW
因为在 npx 的最后一行中找到了 1WW(apx 的第 4 行),并且 SD 的相应条目彼此相差 13 个单位(450 和 455)。
[3] VF456 505 37PD
虽然在 npx 的第二行中发现了 37PD(apx 的最后一行),但该条目不符合 37PD 的质量,因为相应的 SD 值相距超过 13 个单位(200 和 505);但是,npx(第 5 行)中 37PD 的另一个出现的 SD 的相应条目彼此相差 13 个单位,从而使 37PD 有资格出现在结果数据帧中。
我咬紧牙关期待有人向我展示一个非常简单的方法来做到这一点,但宁愿忍受那种尴尬而不是旋转更多的轮子。提前致谢。
如果我了解您要做什么,我认为我们可以使用merge
和subset
功能:
merge_df <- merge(npx, apx, by = 'AD', suffixes = c('npx','apx'))
subset(merge_df, SDnpx - SDapx <= 13 & SDnpx >= SDapx)
AD TNnpx SDnpx TNapx SDapx
3 1WW ZGJU45 455 bear 450
但我承认,我实际上并不太明白你试图强制执行的条件是什么。如果我们对 SD 差异 <= 13 的行感兴趣,那么我们可以执行以下操作:
subset(merge_df, abs(SDnpx - SDapx) <= 13)
AD TNnpx SDnpx TNapx SDapx
1 123M 4 100 222 101
3 1WW ZGJU45 455 bear 450
5 37PD 34256 500 VF456 505
然后将数据转换为最终所需的形式(这也不太清楚)只是重命名和/或从data.frame
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句