道歉,如果这已经解决了,我在这里看不到它。
我正在尝试将CSV数据转换为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中自动执行此操作的任何帮助都将非常有用。
谢谢!
答案 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="")