我有两个列表来自数据框中的列(&gt; = 300,000个条目),第一个列表给出了数据集中的唯一标识符,第二个列表给出了从第一个列表中获取的链接标识符,例如< / p>
ids <- list("a1", "a2", "a3", "a4", "a5", "a6")
linked.ids <- list("a1", "a1", "a3", "a4", "a4", "a4")
我需要创建第三个列表(linked.flag
),如果linked.ids
中的相应条目在列表linked.ids
中只有一个匹配项(即linked.ids
),则该数据框将为空白。它只与自身链接),如果列表library("stringr")
ids <- c("a1", "a2", "a3", "a4", "a5", "a6")
linked.ids <- c("a1", "a1", "a3", "a4", "a4", "a4")
indices <- 1:length(ids)
count.matches <- function(i1, i2) sum(str_count(linked.ids[i1], linked.ids[i2]))
counts <-sapply(indices, FUN=function(x2) sapply(indices, function(x1) count.matches(x1,x2)))
counts <- rowSums(counts)
assign.flag <- function(x) if(counts[x] > 1){"Linked"}else{""}
linked.flag <- sapply(indices, FUN=assign.flag)
df <- data.frame(IDs = ids, Links = linked.ids, LinkFlag = linked.flag)
中有多个匹配项,则链接“已链接”。在上面的例子中,期望的结果将是
我正在寻找一种有效的方法来执行此操作。这是我目前的解决方案:
IDs Links LinkFlag
1 a1 a1 Linked
2 a2 a1 Linked
3 a3 a3
4 a4 a4 Linked
5 a5 a4 Linked
6 a6 a4 Linked
作为输出
{{1}}
我目前的解决方案是对R count times word appears in element of list
中接受的答案的改编我对R来说比较新,并且会对更高效的解决方案表示感谢(编码风格的建议也很受欢迎)。
谢谢!
答案 0 :(得分:1)
以下是创建数据框的方法:
within(data.frame(IDs = unlist(ids),
Links = unlist(ids[match(linked.ids, ids)])),
LinkFlag <- ave(seq_along(Links), Links, FUN = function(x)
if(length(x) > 1) "Linked" else ""))
IDs Links LinkFlag
1 a1 a1 Linked
2 a2 a1 Linked
3 a3 a3
4 a4 a4 Linked
5 a5 a4 Linked
6 a6 a4 Linked
答案 1 :(得分:1)
ids <- c("a1", "a2", "a3", "a4", "a5", "a6")
linked.ids <- c("a1", "a1", "a3", "a4", "a4", "a4")
count = table(linked.ids) > 1
linked.flag = rep("", length(ids))
linked.flag[linked.ids %in% names(count[count])] = "Linked"
df <- data.frame(IDs = ids, Links = linked.ids, LinkFlag = linked.flag)