2014-02-10 35 views
0

我有兩個列表來自數據框中的列(> = 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的適應,並會感謝更有效的解決方案(編碼風格建議也讚賞)。

謝謝!

+0

甲'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

回答

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) 
+0

迄今爲止提到的兩種解決方案都比我的實現要好得多,但在我的實際數據集中,有9個條目(超過300 000),而Baumann的解決方案正確識別了一個關聯事件,而Sven Hohenstein沒有。 –

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 
相關問題