我有两个独立的数据框,如下所示:
#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进行匹配,但似乎无法获得匹配的值。关于如何为部分匹配附加这些值的任何想法?
答案 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