根据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
下面是使用data.table
v >= 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
这是一个很好的答案! –
@ColonelBeauvel我的怎么了? :( – nicola
谢谢你的答案,但我得到以下错误消息转置错误(strsplit(as.character(x),...),fill = fill,ignore.empty = FALSE): object'Ctranspose'找不到 –
谢谢你的回答快一个可能的解决方案!它几乎可行 - 唯一的事情是,取代源/目标栏中的名称(约翰逊等),我可以得到数字。 –
很可能你的列是“因素”(我已经用'character'向量测试过)。在第一行使用'as.character(df $ Name)'改变'df $ Name',它应该可以工作。 – nicola
谢谢!作品像一个魅力:) –