我是R的新手,并且在更新矩阵元素时遇到了一些麻烦。我正在使用的代码是这样的:
library(lubridate)
library(Hmisc)
file=read.csv(filename)
rows<-unique(file$A)
columns<-unique(file$B)
mat<-matrix(0, nrow=length(unique(file$A)), ncol=length(unique(file$B)))
rownames(mat)<-rows
colnames(mat)<-columns
这是一个非常简单的设置。该文件有几列。我想要的是形成两列的矩阵。一列将用作矩阵的行,另一列用作列。一个例子是包含有关飞机飞行的各种信息的文件,而A列是指航班的起源,而B列是指航班的目的地。因此,矩阵将是原点矩阵和目的地,其中每个元素将是从特定原点到特定目的地的航班数。由于我是R的新手,我在原始文件的有限部分尝试了我的方法:
for (i in 1:10){
inc(mat[(file[i,]$A),(file[i,]$B)])<-1
}
inc函数是Hmisc库的一部分,用于增加变量。
当我运行以下打印语句时,例如:
print(mat[(file[2,]$A),(file[2,]$B)])
print(mat["Origin2", "Destination2"])
第一个输出1,而第二个输出0.我不明白为什么会发生这种情况,因为print语句中的两个索引是相同的。
此外,我还为文件的所有行运行for循环,然后将矩阵写入csv文件。当我检查csv文件时,我发现我看起来似乎是任意结果。在大多数情况下,元素为零,但偶尔会有非零元素。当我用原始文件交叉检查非零元素时;但是,我得到了不同的答案。例如,矩阵中的一个元素是38,但是当我检查原始文件时,只有1个条目对应于相同的源和目的地。
对于为什么会发生这种情况的任何见解都将非常感激。
答案 0 :(得分:1)
尝试让您的问题重现。我认为这可能会有所帮助:
origins <- c("A", "B", "C", "D", "A", "B", "A", "B", "E", "D")
dests <- c("X", "Y", "Z", "X", "U", "V", "X", "T", "Y", "X")
df <- data.frame(origins, dests)
df
# origins dests
# 1 A X
# 2 B Y
# 3 C Z
# 4 D X
# 5 A U
# 6 B V
# 7 A X
# 8 B T
# 9 E Y
# 10 D X
table(df$origins, df$dests)
# T U V X Y Z
# A 0 1 0 2 0 0
# B 1 0 1 0 1 0
# C 0 0 0 0 0 1
# D 0 0 0 2 0 0
# E 0 0 0 0 1 0