【问题标题】:Build a third dataframe based on rows in two different dataframes matched by multiple selection criteria根据多个选择条件匹配的两个不同数据帧中的行构建第三个数据帧
【发布时间】:2017-11-11 03:15:52
【问题描述】:

我想检查一个数据帧(“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   

因为 123M(apx 的第一行)在 npx 的第三行中找到,并且 SD 的对应条目彼此相距在 13 个单位以内(100 和 101);但是,在 npx 中第二次出现 123M(在第六行)时,SD 的相应条目之间的差异是 15 个单位。实际上,我只寻找那些 npx 中的 SD 条目比 apx 中相应的 SD 条目大

       [2]    bear  450    1WW    

因为 1WW(apx 的第 4 行)位于 npx 的最后一行,并且 SD 的相应条目彼此相距 13 个单位(450 和 455)。

       [3]    VF456 505    37PD

虽然在 npx 的第二行中找到 37PD(apx 的最后一行),但该条目的质量不符合 37PD,因为相应的 SD 值相隔超过 13 个单位(200 和 505);但是,npx(第 5 行)中另一个出现的 37PD 对应的 SD 条目彼此相差 13 个单位,因此有资格出现在结果数据帧中的 37PD。

我咬牙切齿地期待有人向我展示一个非常简单的方法来做到这一点,但宁愿忍受这种尴尬也不要旋转更多的轮子。提前致谢。

【问题讨论】:

    标签: r subset


    【解决方案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 差异

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      相关资源
      最近更新 更多