创建列表的有效方式,该列表是字符串出现在R中的不同列表中的次数的函数

时间:2014-02-10 11:24:59

标签: string r list apply

我有两个列表来自数据框中的列(&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来说比较新,并且会对更高效的解决方案表示感谢(编码风格的建议也很受欢迎)。

谢谢!

2 个答案:

答案 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)