我想检查一个数据帧(“apx”)中是否有任何行,其中apx中“AD”列的条目与另一个数据帧(“npx”)中“AD”列中的条目匹配,AND ,来自匹配行的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(第六行)时,SD的相应条目之间的差异相差15个单位。实际上,我只是在寻找那些npx中的SD条目是&lt;比apx中相应的SD条目大13(仅)。
[2] bear 450 1WW
因为在npx的最后一行中找到了1WW(第4行apx),并且SD的相应条目彼此相差13个单元(450和455)。
[3] VF456 505 37PD
虽然在npx的第二行中找到了37PD(apx的最后一行),但该条目的质量不是37PD,因为相应的SD值相差超过13个单位(200和505);但是,npx(第五行)中37PD的其他外观的SD的相应条目彼此相差13个单元,从而使得37PD符合结果数据帧。
我咬牙切齿地期待有人向我展示一种非常简单的方法来做到这一点,而是让人感到尴尬而不是旋转更多的轮子。提前致谢。
答案 0 :(得分:1)
如果我了解您要执行的操作,我认为我们可以使用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
重命名和/或删除列。