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)
在我看来,您可以根据大小向数据集添加行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)
sapply(matches, length)为lengths