也许是血腥明显的,但对R来说是新的。我要合并的两个数据帧:
longtext <- c("bla bla burp bla blub", "blah bladd", "blablaz burp")
txt <- data.frame(longtext)
queries <- c("burp", "blah")
query <- data.frame(queries)
我在query
中的较长文字字符串中搜索了txt
中的字符串。比赛保存在样式列表中:
matches <-list(c(1,3), c(2))
列表matches
的第一个索引,例如[[1]]指的是query
中的第一行。第一行(1,3)中matches
的内容是指txt
中的搜索命中第1行和第3行。所以我想通过使用matches
的索引和内容合并两个数据帧来获取:
queries; longtext
"burp"; "bla bla burp blah blub"
"burp"; "blablaz burp"
"blah"; "blah bladd"
但是......我对索引和内容的循环不起作用。 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]]])}}
答案 0 :(得分: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
sapply(matches, length)
替换为lengths
答案 1 :(得分:1)
@David Arenburgs答案更好,但是当我要将其粘贴到:
时names(matches) <- queries
stack(lapply(matches, function(x){longtext[x]}))