我有兩個列表來自數據框中的列(> = 300 000個條目),第一個列表給出一個唯一的標識符從一個數據集,第二個列表給出從第一個列表中取出的鏈接標識符,例如有效的方式來創建列表是一個字符串出現在不同列表中的次數的函數R
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
中有多個匹配項,則輸入「Linked」。在上面的例子中,期望的結果將是
我正在尋找一種有效的方式來執行此操作。這是我目前的解決方案:
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
我目前的解決方案是公認的答案,從R count times word appears in element of list
我是比較新的爲r的適應,並會感謝更有效的解決方案(編碼風格建議也讚賞)。
謝謝!
甲'data.table'溶液:'庫(data.table); dt < - data.table(ID = unlist(ids),Links = unlist(linked.ids),key =「Links」); dt [dt [,.N,by = Links] [,LinkFlag:= ifelse(N> 1,「linked」,「」)] [,list(Links,LinkFlag)]]'。然而,我不知道如果'ifelse'殺死這裏的表現。 – lukeA