我有两个数据框:
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]的新列
答案 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