r - 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 没有。列匹配请帮助。
解决方案
这个不需要任何循环 -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)]))
推荐阅读
- angular - Angular MDB 模块功能在组件中不可用
- postgresql - 如何在postgres的单个命令中插入然后更新从插入查询返回的ID作为返回ID?
- javascript - 如何在执行操作之前检查是否使用jQuery单击了两个按钮
- python - 我试图在heroku上部署我的python和django项目并在日志文件中遇到这个错误
- c++ - 可变参数模板中的模板参数推导失败
- nuxt.js - 如何防止网站 NuxtJS 上的打印错误?
- ascii - Modbus ascii 超时实现
- php - 使用 laravel 在数据库中设置 isopend 标志
- react-native - TypeError:未定义不是一个对象(评估'_UserInfoRedux.UserInfoActions.userInfoRequest')
- c# - .net 核心替换 MvcCodeRouting。基于命名空间的路由