You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R语言中比较两个DataFrame,获取第二个中首个更大值的索引

问题与解决方案

问题描述

现有两个DataFrame:

df1 = data.frame(df1_col = c(0.00002,0.00010,0.00020,0.00100,0.00200))
df2 = data.frame(df2_col1=c(0.00001702406727,0.00002002614159,0.00002018336933,0.0000977206871,0.00010785618371,0.00018966630497,0.00020173904639,0.00099759142132,0.00104912583361,0.00194016482197,0.00200732582737))

需求是将df1的每一行与df2的所有行比较,找到df2中首个大于df1对应值的元素,并将两者合并为新的DataFrame。此前尝试循环遍历+which函数未成功,希望找到更简便的方法。

期望输出:

df3 = data.frame(df1_col1 = c(0.00002,0.00010,0.00020,0.00100,0.00200), df2_col2=c(0.00002002614159,0.00010785618371,0.00020173904639,0.00104912583361,0.00200732582737))

后续补充的新数据:

df1=data.frame(df1_col1=c(0.00002,
0.00010,
0.00020,
0.00100,
0.00200,
0.00250,
0.00400,
0.00500,
0.01000,
0.02000,
0.03000))
df2=data.frame(df2_col1=c(0.00014940969624,
0.00015836812803,
0.00016803247695,
0.00017844541097,
0.00018966630497,
0.00020173904639,
0.00021473722873,
0.00022871767705,
0.00024376616425,
0.00025995387854,
0.00027740350512,
0.00029622853518,
0.00031659411339,
0.00033867002512,
0.00036270484799,
0.00038895378722,
0.00041774363175,
0.00044938435908,
0.00048425557455,
0.00052270555240,
0.00056516734709,
0.00058803959079,
0.00061213685774,
0.00063753303271,
0.00066436020792,
0.00069271759254,
0.00072278590327,
0.00075471258665,
0.00078871891980,
0.00082495135506,
0.00086370796092,
0.00090520244315,
0.00094974375995,
0.00099759142132,
0.00104912583361,
0.00110468513550,
0.00116471796237,
0.00122961947450,
0.00129997381226,
0.00137633261223,
0.00145941148983,
0.00150367150729,
0.00154993475674,
0.00164886456582,
0.00170177926583,
0.00175721404389,
0.00181530011799,
0.00187625634148,
0.00194016482197,
0.00200732582737,
0.00207790286653,
0.00215216527238,
0.00223029743932,
0.00231263720905,
0.00239942910043,
0.00249104495897,
0.00258772950799,
0.00268995918708,
0.00279808620674,
0.00291260618091,
0.00303393957317,
0.00316270550389,
0.00329945165204,
0.00344491415323,
0.00359970294452,
0.00376478162054,
0.00394100416242,
0.00412946943549,
0.00433124287660,
0.00454769286700,
0.00466181286329,
0.00478015613269,
0.00490287219562,
0.00503023860438,
0.00516231516987,
0.00529948405762,
0.00544190977016,
0.00558989424000,
0.00574363032708,
0.00590348262538,
0.00606970711776,
0.00624269632708,
0.00642267044700,
0.00661012222834,
0.00680537865824,
0.00700890517615,
0.00722105704960,
0.00744238908118,
0.00767333589656,
0.00791450623655,
0.00816629638134,
0.00842946839953,
0.00870457800002,
0.00899236514987,
0.00929347419740,
0.00960877976327,
0.00993906664874,
0.01028531629401,
0.01064836560114,
0.01102939995868,
0.01142946986211,
0.01184984756038,
0.01229174638031,
0.01275666542031,
0.01324605799479,
0.01376164646858,
0.01430505034994,
0.01487834806441,
0.01517680797833,
0.01548355354501,
0.01579883472796,
0.01612301677381,
0.01645629840316,
0.01679913158769,
0.01715180723470,
0.01751473695387,
0.01788823000264,
0.01827276128134,
0.01866870741769,
0.01907658694645,
0.01949670526428,
0.01992970835114,
0.02037603813266,
0.02083628226895,
0.02131092986923,
0.02180065884019,
0.02230604531786,
0.02282781673939,
0.02336654192662,
0.02392307856762,
0.02449812744245,
0.02509254651992,
0.02570710318883,
0.02634276037547,
0.02700040459895,
0.02768108720588,
0.02838568468843,
0.02911543211252,
0.02987138853965,
0.03065480656468,
0.03146687637367,
0.03230902465341,
0.03318262955971,
0.03408928114548,
0.03503049532094,
0.03600813039164,
0.03702399530373,
0.03808014377487,
0.03917864953982,
0.04032188867370,
0.04151227866069,
0.04275252873894,
0.04404534794164,
0.04539391077701,
0.04609007134882,
0.04680142876348))

解决方案

观察到df2的列是单调递增的,可利用R内置的findInterval函数快速定位,无需循环,效率更高。该函数能返回每个df1元素在df2中的插入位置,加1即可得到首个大于它的元素索引。

代码实现

针对初始数据

# 提取df2的向量
df2_vals <- df2$df2_col1

# 找到每个df1值对应的首个大于它的df2元素索引
indices <- findInterval(df1$df1_col, df2_vals) + 1

# 提取对应元素并合并为df3
df3 <- data.frame(
  df1_col1 = df1$df1_col,
  df2_col2 = df2_vals[indices]
)

# 查看结果
print(df3)

针对新数据

# 提取df2的向量
df2_vals_new <- df2$df2_col1

# 找到每个df1值对应的首个大于它的df2元素索引
indices_new <- findInterval(df1$df1_col1, df2_vals_new) + 1

# 提取对应元素并合并为df3
df3_new <- data.frame(
  df1_col1 = df1$df1_col1,
  df2_col2 = df2_vals_new[indices_new]
)

# 查看结果
print(df3_new)

结果验证

初始数据运行后输出与期望完全一致:

> print(df3)
  df1_col1     df2_col2
1   0.00002 0.00002002614
2   0.00010 0.00010785618
3   0.00020 0.00020173905
4   0.00100 0.00104912583
5   0.00200 0.00200732583

新数据运行后,以部分值为例:

  • df1中的0.00250对应df2中首个大于它的0.00258772950799
  • df1中的0.03000对应df2中首个大于它的0.03065480656468
    完全符合需求。

补充说明

如果df2不是单调递增的,可先对其排序并记录原索引,或者使用purrr包的map_dbl结合which.min:

library(purrr)

df3 <- data.frame(
  df1_col1 = df1$df1_col
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:45:38