根据多个选择条件匹配的两个不同数据框中的行建立第三个数据帧

问题描述:

我想检查一个数据帧(“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出现在结果数据帧中。

我在咬牙切齿,期待有人向我展示一种非常简单的方法来做到这一点,但是比旋转更多的*还要遭受尴尬。提前致谢。

如果我理解你想要做什么,我想我们可以用mergesubset功能:

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中的列。