在R中的另一个table中获取指定值范围内小于特定值的第一个值的位置

Get the position of the first value lesser than a particular value over a specified range of value in another table in R

我在用 R 复制一个用 Excel 编写的函数时遇到了麻烦。我的想法是让第一个值的位置小于 table 中的某些值。我在 excel 中使用索引匹配来解决这个问题,但在 R 中似乎无法这样做。这是第一个 table 称为 table1 [这 table 显示了我想要的最终结果,如 Match。][1]

“匹配”列是使用此公式获得的

[公式][2]

该公式基本上是从 table2 中获取第一个值的位置,该值低于列 H(价格)中的值,同时使用列 F(起始行)和 G(结束行)中的范围

这是 table2 的片段 [表 2][3]

我已经在 R 中创建了粗略的 tables 表 1

table1 = data.frame(startRow = c(1, 1,  1,  1,  1,  1,  1214,   1214,   1214,   1214,   1214,   1214), 
                    EndRow =  c(1213,   1213,   1213,   1213,   1213,   1213,   2436,   2436,   2436,   2436,   2436,   2436), 
                    Price = c(-30,  -9.98,  0.84529776, 0.86587152, 0.9082343302,   0.9303399076,   -30,    -9.98,  0.73987384, 0.75788168, 0.7949610816,   0.814309693))

表 2

table2 = data.frame(Price = c(-33.336,  -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -33.336,    -11.1108,   -11.1108,   -11.1108,   -11.1108,   -11.1108,   -11.1108,   -11.1108,   -11.1108,   -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -10,    -9.999, -9.999, -9.999, -9.999, -9.999, -9.999, -8.02,  -8.02,  -7.02,  -7.02,  -5.98,  -5.98,  -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2.9336,    -2.9336,    -2.9336,    -2.9336,    -2.9336,    -2.9336,    -2.9336,    -2.9336,    -2.9336,    -2.9336,    -2.9336,    -2.9336,    -1.8,   -1.8,   -1.296, -1.296, -1.258, -1.258, -1.22,  -1.22,  -1.2,   -1.2,   -1.182, -1.182, -1.144, -1.144, -1.106, -1.106, -1.068, -1.068, -1.03,  -1.03,  -1.002, -1.002, -1, -1, -1, -1, -1, -1, -1, -1, -0.992, -0.992, -0.954, -0.954, -0.916, -0.916, -0.878, -0.878, -0.838, -0.838, -0.8,   -0.8,   -0.762, -0.762, -0.724, -0.724, -0.686, -0.686, -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6668,    -0.6492,    -0.6492,    -0.648, -0.648, -0.61,  -0.61,  -0.6,   -0.6,   -0.572, -0.572, -0.534, -0.534, -0.5,   -0.5,   -0.496, -0.496, -0.458, -0.458, -0.42,  -0.42,  -0.4,   -0.4,   -0.4,   -0.4,   -0.382, -0.382, -0.38,  -0.38,  -0.344, -0.344, -0.306, -0.306, -0.3,   -0.3,   -0.268, -0.268, -0.228, -0.228, -0.2222,    -0.2222,    -0.2222,    -0.2222,    -0.2222,    -0.2222,    -0.2222,    -0.2,   -0.2,   -0.19,  -0.19,  -0.152, -0.152, -0.1334,    -0.1334,    -0.1334,    -0.1334,    -0.12,  -0.12,  -0.12,  -0.12,  -0.12,  -0.12,  -0.12,  -0.12,  -0.12,  -0.12,  -0.12,  -0.12,  -0.12,  -0.12,  -0.114, -0.114, -0.1054,    -0.1054,    -0.08,  -0.08,  -0.076, -0.076, -0.04,  -0.04,  -0.038, -0.038, -0.02,  -0.02,  -0.02,  -0.02,  -0.02,  -0.02,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
                               0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0.038,  0.038,  0.04,   0.04,   0.076,  0.076,  0.114,  0.114,  0.12,   0.12,   0.152,  0.152,  0.19,   0.19,   0.2,    0.2,    0.228,  0.228,  0.266,  0.266,  0.304,  0.304,  0.32,   0.32,   0.342,  0.342,  0.36,   0.36,   0.382,  0.382,  0.42,   0.42,   0.44,   0.44,   0.458,  0.458,  0.48,   0.48,   0.496,  0.496,  0.4978, 0.4978, 0.4982, 0.4982, 0.5098, 0.5098, 0.52,   0.52,   0.52,   0.52,   0.52,   0.52,   0.5212, 0.5212, 0.5328, 0.5328, 0.5346, 0.5346, 0.5416, 0.5416, 0.5444, 0.5444, 0.5444, 0.5444, 0.5558, 0.5558, 0.5584, 0.5584, 0.56,   0.56,   0.6,    0.6,    0.62,   0.62,   0.653,  0.653,  0.66,   0.66,   0.6714, 0.6714, 0.6716, 0.6716, 0.68,   0.68,   0.68,   0.68,   0.68,   0.68,   0.68,   0.68,   0.686,  0.686,  0.7,    0.7,    0.724,  0.724,  0.74,   0.74,   0.74,   0.74,   0.76,   0.76,   0.762,  0.762,  0.7714, 0.7714, 0.7754, 0.7754, 0.7852, 0.7852, 0.7972, 0.7972, 0.8,    0.8,    0.8,    0.8,    0.8336, 0.8336, 0.838,  0.838,  0.85,   0.85,   0.876,  0.876,  0.889,  0.889,  0.914,  0.914,  0.954,  0.954,  0.96,   0.96,   0.9778, 0.9778, 0.9852, 0.9852, 0.9864, 0.9864, 0.992,  0.992,  0.999,  0.999,  1,  1,  1,  1,  1.0176, 1.0176, 1.0276, 1.0276, 1.03,   1.03,   1.0614, 1.0614, 1.068,  1.068,  1.106,  1.106,  1.1112, 1.1112, 1.144,  1.144,  1.1446, 1.1446, 1.1506, 1.1506, 1.16,   1.16,   1.1702, 1.1702, 1.1742, 1.1742, 1.1752, 1.1752, 1.182,  1.182,  1.2002, 1.2002, 1.2162, 1.2162, 1.2162, 1.2162, 1.2162, 1.2162, 1.22,   1.22,   1.233,  1.233,  1.244,  1.244,  1.258,  1.258,  1.26,   1.26,   1.296,  1.296,  1.334,  1.334,  1.3376, 1.3376, 1.3378, 1.3378, 1.3378, 1.3378, 1.3426, 1.3426, 1.3534, 1.3534, 1.36,   1.36,   1.372,  1.372,  1.3732, 1.3732, 1.3788, 1.3788, 1.4072, 1.4072, 1.41,   1.41,   1.448,  1.448,  1.4592, 1.4592, 1.4596, 1.4596, 1.4596, 1.4596, 1.48,   1.48,   1.486,  1.486,  1.524,  1.524,  1.53,   1.53,   1.56,   1.56,   1.564,  1.564,  1.58,   1.58,   1.5808, 1.5808, 1.5812, 1.5812, 1.5812, 1.5812, 1.602,  1.602,  1.64,   1.64,   1.6446, 1.6446, 1.6496, 1.6496, 1.6578, 1.6578, 1.6774, 1.6774, 1.678,  1.678,  1.68,   1.68,   1.689,  1.689,  1.7024, 1.7024, 1.7028, 1.7028, 1.7028, 1.7028, 1.716,  1.716,  1.754,  1.754,  1.76,   1.76,   1.7836, 1.7836, 1.792,  1.792,  1.824,  1.824,  1.8244, 1.8244, 1.8244, 1.8244, 1.83,   1.83,   1.868,  1.868,  1.906,  1.906,  1.944,  1.944,  1.982,  1.982,  2.02,   2.02,   2.058,  2.058,  2.08,   2.08,   2.096,  2.096,  2.134,  2.134,  2.174,  2.174,  2.212,  2.212,  2.25,   2.25,   2.288,  2.288,  2.326,  2.326,  2.364,  2.364,  2.4,    2.4,    2.4,    2.4,    2.4,    2.4,    2.402,  2.402,  2.44,   2.44,   2.478,  2.478,  2.48,   2.48,   2.4938, 2.4938, 2.8892, 2.8892, 2.8892, 2.8892, 2.8892, 2.8892, 2.8994, 2.8994, 3,  3,  3.28,   3.28,   3.3,    3.3,    3.305,  3.305,  3.3336, 3.3336, 3.3336, 3.3336, 3.3336, 3.3336, 3.5618, 3.5618, 3.6,    3.6,    4.1296, 4.1296, 4.2,    4.2,    4.8,    4.8,    4.9264, 4.9264, 4.9464, 4.9464, 5,  5,  5.38,   5.38,   5.4886, 5.4886, 5.5,    5.5,    5.84,   5.84,   5.86,   5.86,   6,  6,  6.04,   6.04,   6.06,   6.06,   6.1284, 6.1284, 6.6672, 6.6672, 7,  7,  7,  7,  8.597,  8.597,  8.7494, 8.7494, 8.8084, 8.8084, 8.8538, 8.8538, 8.978,  8.978,  9,  9,  9.0014, 9.0014, 9.1952, 9.1952, 9.3064, 9.3064, 9.7396, 9.7396, 9.7786, 9.7786, 9.9766, 9.9766, 9.9766, 9.9766, 9.98,   9.98,   9.985,  9.985,  10, 10, 10, 10, 10, 10, 10.0022,    10.0022,    10.0022,    10.0022,    10.0022,    10.0022,    11.112, 11.112, 11.1144,    11.1144,    19.98,  19.98,  50, 50, 59.9882,    59.9882,    60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    
                               200.016,200.016, 200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    
                               200.016, 200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    
                               200.016, 200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    200.016,    
                               0,   0,  0,  0,  0,  0
))

我尝试使用 r 中的 findinterval 为每一行创建一个新的 table

    atest = as.data.frame ((table2$Price[findInterval(seq(table1$StartRow[1],table1$EndRow[1],by=1),table2$row)]))
names(atest)[1]= "te"

然后使用 which

查找值
a = min(which ( table1$Price[1] > atest$te))

我仍然没有得到所需的输出

现在我需要 r 中的匹配列。有什么想法吗? [1]: https://i.stack.imgur.com/6OY2j.png [2]: https://i.stack.imgur.com/emMrD.png [3]: https://i.stack.imgur.com/0xXnn.png

您为此使用了任何应用函数。

使用mapply

table2$index <- 1:nrow(table2)
table1$match <- mapply(function(x, y, z) {
  dat <- subset(table2, index >= x & index <= y)
  which(dat$Price > z)[1]
  }, table1$startRow, table1$EndRow, table1$Price)

我们在 table2 (index) 中创建另一列来跟踪行号,该行号用于使用 startRowEndRow 筛选行。