首页 > 解决方案 > R中的Vlookup / Match函数用于R中的连续列

问题描述

我有一个 2 数据框。df1:

Dis1_SubDIs1_Village1       Dis2_SubDIs1_Village1   Dis1_SubDIs2_Village1
JODHPUR|JODHPUR|JODHPUR     |JODHPUR|JODHPUR        JODHPUR||JODHPUR
JHUNJHUNUN|JHUNJHUNUN|BARI  |JHUNJHUNUN|BARI        JHUNJHUNUN|BARI|BARI
BUNDI|HINDOLI|BUNDI         |HINDOLI|BUNDI          BUNDI|BUNDI|BUNDI
SIROHI|SIROHI|SIROHI        |SIROHI|SIROHI          SIROHI||SIROHI
ALWAR|ALWAR|BASAI           |ALWAR|BASAI            ALWAR||BASAI
BHARATPUR|BHARATPUR|SEEKRI  |BHARATPUR|SEEKRI       BHARATPUR||SEEKRI

第二个数据 df2 :

High
|BHARATPUR|SEEKRI
BUNDI|HINDOLI|BUNDI
SIROHI||SIROHI
CHURU|TARANAGAR|DABRI CHHOTI

现在,我想在 df1 中针对 df2 列应用 vlook/match。我们在excel中做的一样。如果有完全匹配,给我匹配,否则为 0。

我尝试在 R For match 中制作函数

for(i in names(df1)){
  match_vector = match(df_final[,i], df$High, incomparables = NA)

  df1$High = df2$High[match_vector]

}

但得到一个错误。它仅显示最后一列并替换其他列的值。

对于 vlookup:

func_vlook = function(a){
  for(i in 1:ncol(a)) {
    lookup_df = vlookup_df(lookup_value = i, 
                   dict = df2,
                   lookup_column = 1)

  }

  return(lookup_df)

}

lookup_df <- func_vlook(a = df1)

仍然出现错误。

我的最终输出应如下所示,附带 df 文件:

Dis1_SubDIs1_Village1_M1   Dis2_SubDIs1_Village1_M2   Dis1_SubDIs2_Village1_M3
NA                         NA                             NA
NA                         NA                             NA
BUNDI|HINDOLI|BUNDI        NA                             NA
NA                         SIROHI||SIROHI              SIROHI||SIROHI
NA                         NA                             NA
NA                         NA                          |BHARATPUR|SEEKRI

对于 N 号。列,应该有 N 没有。列匹配请帮助。

标签: rmatchvlookup

解决方案


这个不需要任何循环 -apply并且match应该可以正常工作。apply将迭代您拥有的尽可能多的列,因此输出将具有与输入相同的列数。在您的示例中,apply将简化以生成矩阵。

apply(X = df1, 
      MARGIN = 2,
      FUN = function(x) df2$High[match(x, df2$High)])

如果您需要一个数据框作为输出,请将下面的代码包装在 as.data.frame()

as.data.frame(apply(X = df1, 
      MARGIN = 2,
      FUN = function(x) df2$High[match(x, df2$High)]))

推荐阅读