将数据框中字符串的一部分与另一个数据框中的字符串匹配

时间:2017-06-15 12:13:28

标签: r

我有两个独立的数据框,如下所示:

#data frame 1
set.seed(5)
first<-c("Jane, Sarah","Bill, Conrad", "Jim, Dave", "Mark, Ben", "Mike, Frank")
month<-c("Feb","Jan","Dec","Jun","Aug")
df1<-data.frame(first,month)

#data frame 2
first<-c("John", "Brendan", "Mark", "Dave", "Sarah", "Julie", "Frank", "Henry")
vals<-seq(8)*floor(runif(8,min=10, max=100))
df2<-data.frame(first,vals)

当与任一名称匹配时,我想要做的是将第二个数据帧中的值附加到第一个数据帧(这两个数据都不匹配,只有一个匹配)。如果没有匹配项,则可以为值分配“&#39; 0&#39;。

这个想法最终会得到一个如下所示的最终数据框:

#data frame final
first<-c("Jane, Sarah","Bill", "Jim, Dave", "Mark", "Mike, Frank")
month<-c("Feb","Jan","Dec","Jun","Aug")
vals<-c(95,0,140,276,399)
df3<-data.frame(first,month,vals)

我尝试过使用grep进行匹配,但似乎无法获得匹配的值。关于如何为部分匹配附加这些值的任何想法?

1 个答案:

答案 0 :(得分:1)

这对你有用吗?我们从first列中提取所有单词,然后在结果中提取lapply以获取匹配项。

library(stringr)

df_res <- df1
df_res$vals <- lapply(str_extract_all(df1$first, "\\w+"), function(x) {res <- df2$vals[match(x, df2$first)]
                                                                       res[is.na(res)] <- 0
                                                                       max(res)
                                                             })

df_res
#         first month vals
#1  Jane, Sarah   Feb   95
#2 Bill, Conrad   Jan    0
#3    Jim, Dave   Dec  140
#4    Mark, Ben   Jun  276
#5  Mike, Frank   Aug  399