基于由多个选择标准匹配的两个不同数据帧中的行构建第三个数据帧

时间:2017-11-11 03:15:53

标签: r subset

我想检查一个数据帧(“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符合结果数据帧。

我咬牙切齿地期待有人向我展示一种非常简单的方法来做到这一点,而是让人感到尴尬而不是旋转更多的轮子。提前致谢。

1 个答案:

答案 0 :(得分:1)

如果我了解您要执行的操作,我认为我们可以使用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重命名和/或删除列。