使用查找表替换字符串的一部分

时间:2019-08-06 19:16:18

标签: r for-loop dplyr

我有两个数据框:

DF1:一列200行的字符串

DF2:两列130行:

  • 第一列的子字符串包含在DF1 $ messy

  • 第二列还有另一个带有正确命名法的字符串。

看起来像这样

DF1: 
-----------------
|   messy   |

| abc.'123_c |

| def.'456_c |

| hij.'789_c |


DF2:
-----------------
|   old_str      |    new_str    |

|    123         |      aa       |

|    789         |      cc       |

我需要一种方法,将字段DF1 $ messy与子字符串DF2 $ old_str匹配,以将字段DF2 $ new_str引入DF1

我首先尝试编写一个for循环,希望该函数将适用于整个列:

    df1$new.str <- 0
    correct_field <-
     for (i in 1:nrow(df1)){ 
      IF (df1$messy[i] == df2$old_str)
      df1$clean[i] = df2$new_str
    }

第二,我尝试了difference_left_join函数:

    library(dplyr)
    library(fuzzyjoin)
    test<-difference_left_join(df1, df2, by = c(cut = 'Data.Lake.Field' )

(我在两个数据集“ Data.Lake.Field”中都重命名了连接列)

所需的输出:

-----------------
|   messy      |    new_str    |

|    abc.'123_c         |      aa       |

|    def.'456_c         |     NULL      |

|    hij.'789_c         |      cc       |

编辑: 我认为,从理论上讲,最好的解决方法是建立一个FOR循环,在DF1中添加一个新列,该列在DF1 $ messy中占据一行[i],并在DF2 $ old中搜索一个匹配项,并用与该DF2 $ old值相关的DF2 $ new的确切值。我不确定如何执行此操作,因为对行使用[i]后缀始终会返回相同的行号...例如,我要如何获取一行-例如DF1 $ messy [142]-并创建与DF2 $ old [15]进行模糊匹配,并创建一个返回DF2 $ new [15]的新列

1 个答案:

答案 0 :(得分:1)

您可以折叠搜索词,并将其与原始数据中的“混乱”词匹配。然后使用匹配项来加入数据框。

df1 <- data.frame(messy=c('abc','def','ghi'),stringsAsFactors = F)
df2 <- data.frame(old=c('ab','ef','hi'),new=c(1:3),
                  stringsAsFactors = F)

df2$messy <- grep(paste(df2$old,collapse = '|'),df1$messy,value = T)

left_join(df2,df1)

Joining, by = "messy"
  old new messy
1  ab   1   abc
2  ef   2   def
3  hi   3   ghi