使用fastLink包循环处理拆分后的数据框时遇到的问题
解决批量调用fastLink循环失败的问题
嗨,我看了你遇到的问题啦!你的循环代码跑不起来,核心原因其实很简单:你用paste0生成的是对象名的字符串(比如"pruebaA_df1"),但prueba()函数需要的是实实在在的data.frame对象,不是一串文字。直接把字符串传进去,fastLink自然会报错啦。
下面给你两种解决思路,我更推荐第二种,因为它更符合R的编程习惯,还不会乱你的全局环境~
方法1:给循环加个get(),把字符串转成对象
如果你还是想保留把拆分后的数据放到全局环境的做法,可以在循环里用get()函数,把字符串形式的对象名转换成实际的data.frame:
unique(df1$col1)->nom2b indices<- list() uniones<- list() for (i in nom2b){ # 用get()把对象名字符串转成真实的data.frame d1<- get(paste0(i,"_df1")) d2<- get(paste0(i,"_df2")) prueba(d1,d2) indices[[paste0("modelo",i)]]<-indi uniones[[paste0("uniones",i)]]<- dfA.match }
不过这种方式有点依赖全局环境,时间长了容易搞混变量,不太推荐长期用哦。
方法2:用列表管理拆分数据(强推!)
更好的做法是别把拆分后的data.frame扔到全局环境,直接用列表存起来,循环起来更顺手,还不会污染你的命名空间:
第一步:拆分数据到列表(代替list2env)
# 把df1按col1拆分,存到列表df_list1里 df_list1 <- split(df1, df1$col1) # 给列表里的元素改个名,加上_df1后缀 names(df_list1) <- paste0(names(df_list1), "_df1") # 同理处理df2 df_list2 <- split(df2, df2$col1) names(df_list2) <- paste0(names(df_list2), "_df2")
第二步:改造你的prueba函数(去掉全局赋值)
原函数里用<<-给全局变量赋值,批量处理时很容易出问题。不如让函数直接返回匹配结果,这样更稳妥:
library(fastLink) prueba <- function(d1, d2) { out <- fastLink( dfA = d1, dfB = d2, varnames = c("col1","col2"), partial.match = c("col2"), stringdist.match = c("col2") ) # 把需要的结果打包成列表返回 list( match_indices = out$matches, matched_dfA = d1[out$matches$inds.a,] ) }
第三步:循环处理列表里的数据
unique(df1$col1)->nom2b indices<- list() uniones<- list() for (i in nom2b){ # 从列表里取出对应分组的data.frame d1 <- df_list1[[paste0(i,"_df1")]] d2 <- df_list2[[paste0(i,"_df2")]] # 调用函数拿到匹配结果 result <- prueba(d1, d2) # 把结果存到对应的列表里 indices[[paste0("modelo",i)]] <- result$match_indices uniones[[paste0("uniones",i)]] <- result$matched_dfA }
这样跑完循环后,indices和uniones列表里就整整齐齐地存着每个分组的匹配索引和匹配后的dfA数据啦!
小提醒
- 尽量少用
<<-全局赋值,它会偷偷改全局环境的变量,批量处理时很容易让变量乱掉。 - 用列表管理批量数据是R里的好习惯,整洁又好维护~
内容的提问来源于stack exchange,提问作者DudaR
相关产品推荐
相关产品推荐

