2015-04-07 125 views
2

我需要進行網絡可視化,並且我有數據,但是格式不正確!數據看起來的R中一個數據幀如下:根據R中的另一個值進行行值組合

Title  Name 
Article1 Johnson 
Article1 Hansson 
Article1 Michaels 
Article2 Nielsson 
Article2 Madsen 
Article2 Shannon 
Article2 Paddington 

而且我想找到基於標題名稱的組合 - 即合作作者,所以在這種格式的輸出

Source  Target  Title 
Johnson Hansson  Article1 
Johnson Michaels Article1 
Hansson Michaels Article1 
Nielsson Madsen  Article2 
Nielsson Shannon  Article2 
Nielsson Paddington Article2 
Madsen  Shannon  Article2 
Madsen  Paddington Article2 
Shannon Paddington Article2 

的網絡是無向的,因此源/目標只是列名來說明。那麼我如何在R中做到這一點?我確信有一個簡單的方法,但我找不到它。

回答

2

試試這個,在base R:

combos<-tapply(df$Name,df$Title,function(x) t(combn(x,2))) 
cbind(setNames(as.data.frame(do.call(rbind,combos)),c("Source","Target")),Title=rep(names(combos),vapply(combos,nrow,1L))) 

# Source  Target Title 
#1 Johnson Hansson Article1 
#2 Johnson Michaels Article1 
#3 Hansson Michaels Article1 
#4 Nielsson  Madsen Article2 
#5 Nielsson Shannon Article2 
#6 Nielsson Paddington Article2 
#7 Madsen Shannon Article2 
#8 Madsen Paddington Article2 
#9 Shannon Paddington Article2 
+0

謝謝你的回答快一個可能的解決方案!它幾乎可行 - 唯一的事情是,取代源/目標欄中的名稱(約翰遜等),我可以得到數字。 –

+0

很可能你的列是「因素」(我已經用'character'向量測試過)。在第一行使用'as.character(df $ Name)'改變'df $ Name',它應該可以工作。 – nicola

+0

謝謝!作品像一個魅力:) –

4

下面是使用data.tablev >= 1.9.5和新tstrsplit功能

library(data.table) # v >= 1.9.5 
setDT(df)[, setNames(tstrsplit(combn(Name, 2, toString, simplify = FALSE), ", "), 
        c("Source", "Target")), 
      by = Title] 
#  Title Source  Target 
# 1: Article1 Johnson Hansson 
# 2: Article1 Johnson Michaels 
# 3: Article1 Hansson Michaels 
# 4: Article2 Nielsson  Madsen 
# 5: Article2 Nielsson Shannon 
# 6: Article2 Nielsson Paddington 
# 7: Article2 Madsen Shannon 
# 8: Article2 Madsen Paddington 
# 9: Article2 Shannon Paddington 
+0

這是一個很好的答案! –

+0

@ColonelBeauvel我的怎麼了? :( – nicola

+0

謝謝你的答案,但我得到以下錯誤消息轉置錯誤(strsplit(as.character(x),...),fill = fill,ignore.empty = FALSE): object'Ctranspose'找不到 –

相關問題