将CSV单列数据转换为交互矩阵

时间:2014-05-19 17:22:25

标签: r csv matrix social-networking

道歉,如果这已经解决了,我在这里看不到它。

我正在尝试将CS​​V数据转换为R或Excel中的交互矩阵。

基本上,我有连续每篇论文的作者,需要将每一行合并为一个交互。例如:

Current: 
1. A; B; C; D
2. E; F; C
3.  A; G; D; C

Need: 
   A B C D E F G
A    1 2 2     1
B  1   1 1
C  2 1   2 1 1 1
D  2 1 2 1     1
E      1     1
F      1   1
G  1   1       1

从当前CSV中自动执行此操作的任何帮助都将非常有用。

谢谢!

1 个答案:

答案 0 :(得分:0)

我不太了解您的输入数据是什么样的,但我们假设您能够将数据读入列表,其中每个条目都是作者的向量,如下所示:

papers<-list(
    P1=c("A", "B", "C", "D"),
    P2=c("E", "F", "C"),
    P3=c("A", "G", "D", "C")
)

首先,我拿每篇论文并将作者姓名与论文名称合并

apl <- lapply(names(papers), function(x) cbind(paper=x,author=papers[[x]]))

然后我将所有这些部分组合成一个大型data.frame

dapl <- data.frame(do.call(rbind, apl))

然后我将每篇论文的作者数量制成表格

tap <- table(dapl)

然后我采用交叉产品来与每位作者进行互动

crossprod(tap)

这似乎是你追求的矩阵。你可以在线上

完成所有这些
crossprod(table(data.frame(do.call(rbind, 
    lapply(names(papers), function(x) cbind(paper=x,author=papers[[x]])))))) 

#       author
# author A B C D E F G
#      A 2 1 2 2 0 0 1
#      B 1 1 1 1 0 0 0
#      C 2 1 3 2 1 1 1
#      D 2 1 2 2 0 0 1
#      E 0 0 1 0 1 1 0
#      F 0 0 1 0 1 1 0
#      G 1 0 1 1 0 0 1

唯一的区别是没有空白条目。在对角线上填充零,并在主对角线上为每位作者提供总纸张数。

如果您的数据格式与样本完全相同,则可以使用以下方法创建论文列表。 (这里我使用textConnection,但您可以轻松使用文件名)

tt<-textConnection("1. Rashid, Umer; Ahmad, Junaid; Yunus, Robiah; Ibrahim, Muhammad; Masood, Hassan; Syam, Azhari Muhammad
2. Hussain, Raja Azadar; Badshah, Amin; Tahir, Muhammad Nawaz; Tamoor-ul- Hassan; Bano, Asghari 
3. Shahida, Shabnam; Ali, Akbar; Khan, Muhammad Haleem
4. Khan, Mumtaz; Jabbar, T.; Asif, M.; Anjum, M. I.; Dilband, M.; Khan, K.; Jabbar, A.; Arshed, W."
)

lines<-readLines(tt)
close(tt) #not needed if you supply file name to readLines

#split paper number and list of authors
spt<-strsplit(lines,"(?<=\\d)\\.\\s+","",perl=T)

#split authors
papers <- strsplit(sapply(spt, '[', 2), ";\\s+")
#add fake paper names
names(papers) <- paste("P", sapply(spt, '[',1), sep="")