根据多个选择条件匹配的两个不同数据框中的行建立第三个数据帧
我想检查一个数据帧(“apx”)中是否有任何行,其中来自apx中“AD”列的条目与条目匹配在另一个数据帧(“npx”)的“AD”列中,AND,其中来自匹配行的SD条目在另一个数据帧的13个单位内。根据多个选择条件匹配的两个不同数据框中的行建立第三个数据帧
我检查过几个不同的参考,但由于我需要建立第三个数据帧(和其他原因),找不到答案。
我的工作试用这个...
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)内;然而,在第二次出现123M的npx(第六行)中,SD的相应条目之间的差异相距15个单位。实际上,我仅查找那些npx中的SD条目大于(仅)比apx中的相应SD条目更大的实例。
[2] bear 450 1WW
因为1WW(APX的第四行)的NPX最后一行和用于SD的相应条目中找到的是内13个单位彼此(450和455)的。
[3] VF456 505 37PD
虽然37PD(APX的最后一行)NPX的第二行中被发现,该条目不质量37PD因为相应的SD值是超过13个单位间隔(200和505);然而,npx(第五行)中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
中的列。