R - 使用索引和列表内容合并两个数据帧[R]

moe*_*lot 2 merge for-loop r apply dataframe

也许是血腥明显的,但对R来说是新的.我要合并的两个数据帧:

longtext <- c("bla bla burp bla blub", "blah bladd", "blablaz burp")
txt <- data.frame(longtext)
queries <- c("burp", "blah")
query <- data.frame(queries)
Run Code Online (Sandbox Code Playgroud)

query在更长的文本字符串中搜索了字符串txt.比赛保存在一个样式列表中:

matches <-list(c(1,3), c(2))
Run Code Online (Sandbox Code Playgroud)

列表的第一个索引matches,例如[[1]]指的是第一行query.的内容matches的第一行(1,3)中是指搜索命中行1和3 txt.所以我想通过使用索引和内容来合并两个数据帧matches:

queries; longtext        
"burp"; "bla bla burp blah blub"
"burp"; "blablaz burp"
"blah"; "blah bladd"
Run Code Online (Sandbox Code Playgroud)

但是......我对索引和内容的循环不起作用.有更简单的方法apply()吗?将提供大量数据......

matches_long <- data.frame()  
for (i in 1:length(matches)) {
  for (l in 1:length(matches[[i]])) {
    matches_long[[l]] <- data.frame(query[[i]], txt[[matches[[i]][l]]])}}  
Run Code Online (Sandbox Code Playgroud)

Dav*_*urg 5

在我看来,您可以根据大小向数据集添加行matches,然后只分配匹配的值

res <- query[rep(seq_along(matches), sapply(matches, length)),, drop = FALSE] 
res["longtext"] <- txt$longtext[unlist(matches)]
res
#     queries              longtext
# 1      burp bla bla burp bla blub
# 1.1    burp          blablaz burp
# 2      blah            blah bladd
Run Code Online (Sandbox Code Playgroud)
  • 在R v 3.2+中,您可以替换sapply(matches, length)lengths