根据R中的另一个值进行行值组合

根据R中的另一个值进行行值组合

问题描述:

我需要进行网络可视化,并且我有数据,但是格式不正确!数据看起来的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中做到这一点?我确信有一个简单的方法,但我找不到它。

试试这个,在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

谢谢!作品像一个魅力:) –

下面是使用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'找不到 –