【问题标题】:Choosing specific digits of values from two datasets从两个数据集中选择特定数字的值
【发布时间】:2019-10-23 14:07:47
【问题描述】:

我对 R 比较陌生。我正在寻找一种方法来根据某些条件从站点的两个点数据集中选择 pfaf 的特定值。 data2 是 data1 的子集。但我只包含了一个匹配的值。

数据1:

site      id    strahler      pfaf
1331879 1232926 4             4359
1331341 1232926 2             816
1330121 1232926 1             45 
1331842 1232926 3             4
1331841 1232926 2             552
1329931 1206877 3             413
1329614 1206877 2             47
1329591 1206877 1             8179
1329517 1206877 1             4463
1331411 1554221 1             912
1331364 1554221 1             92
1329694 1554221 2             9113
1331486 1554221 3             8

我需要从 data1 中获取与一系列 pfaf 数字相对应的网站系列(几个)。这些 pfaf 号码需要遵循这些规则。

1) data2$pfaf 的前 n 位与 data1$pfaf 完全匹配,其中 n ≥ 0,AND

2) data2$pfaf 的剩余位数小于和/或等于data1$pfaf 的剩余位数

同时,data2$pfaf 和 data1$pfaf 的 id 需要相同才能进行比较。并且站点的 strahler 必须小于或等于点的 strahler。

数据2:

points  id      strahler    pfaf
1331485 1206877 3           821
1329690 1206877 2           47
1329598 1232926 4           46
1329936 1554221 1           962

正确的输出是:

points  pfaf_of_site    site
1331485 816, 8179       1329614, 1329591
1329690 4463            1329517
1329598 4359, 45, 4     1331879, 1330121, 1331842
1329936 912, 92         1331411, 1331364

如果有人可以做到这一点,非常感谢您的帮助。

【问题讨论】:

  • 请 (1) 举一个data2$PFAFFSTETTER 的小例子(3 行就足够了)。 (2) 告诉我们更多关于n...n 有具体的价值吗?或者你想最大化n?或者您想为n 的不同值运行? (3) 根据您提供的示例输入显示您的预期输出。
  • 输出我想要 data2 中所有带有 PFAFSTETTER 编号的 WSO1_ID,它对应于 data1 中 WSO1_ID 的 PFAFSTETTER 编号,因为 data2 是完整的数据集。所有搜索都需要基于相同的 WSO_ID。 n 是任何 PFAFSTETTER 数的第一个数。因此,如果是 821,那么我需要所有数字,例如 834、86611、822。这是一个足够好的例子吗? data2 具有相同的布局。它只是有更多种类的 WSO_ID,甚至更多的 WSO1_ID。对于更多上下文,它是一个水文系统值。
  • 是的,这很好。我已经减少了您的示例数据,因此它们更易于理解和理解。我很惊讶/困惑data2$PFAFSTETTE 是用小数打印的——它们应该是整数吗?小数重要吗?
  • 我仍然对输出感到困惑。现在我们有了一个很好的小例子(可以随意剪切更多行!),你能给出预期的输出吗?比如data2的第一行有一个1,而data1的行没有以1开头,所以我认为没有匹配。第二行,data2 是 45。如果我们采用 n = 1,我认为应该匹配 data1 中的 464748,因为 4 == 4 和 5 4463,因为5 < 463?还是因为5 > 4不匹配?如果有461,是因为5 < 6 匹配,还是因为5 > 1 不匹配?
  • 最后,为了澄清这个问题,OBJECTIDWSO_ID, and STRAHLER` 根本不重要,对吗?您提到的唯一列是PFAFFSTETTERWSO1_ID

标签: r subset


【解决方案1】:

也许你想要类似下面的函数?未经测试,因为没有 data2 示例。

funMatch <- function(X, Y, n = 1){
  x <- as.character(X[['PFAFSTETTER']])
  x.n <- substr(x, 1, n)
  x.remaining <- substring(x, n + 1)
  y <- as.character(Y[['PFAFSTETTER']])
  y.n <- substr(y, 1, n)
  y.remaining <- substring(y, n + 1)
  i <- which(y.n %in% x.n & length(y.remaining) < length(x.remaining))
  Y[['WSO1_ID']][i]
}

funMatch(data1, data2, n = 1)
funMatch(data1, data2, n = 2)

【讨论】:

    猜你喜欢
    • 2021-02-08
    • 2014-05-15
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多