将矩阵对角线设为零在R中的实现

16

我在这里尝试了几个提出的解决方案,但对于我的情况并没有起作用。 这是我的代码:

a <- read.table("Whirr_127.csv", header=T, sep=",", row.names=1) # task assignment / people vs task
b <- read.table("Files_Whirr_127.csv", header=T, sep=",", row.names=1) #task vs files 
a
b

#calc cr , cr = ta * tf * transpose(ta)
cr <- as.matrix(a) %*% (as.matrix(b) %*% as.matrix(t(b)) %*% as.matrix(t(a)))
cr

#set value to 1, to initialize table
cr[cr>=1]<-1
cr

#identify diagonal matrix, set to zero
cr<-as.matrix(0,ncol=ncol(cr),nrow=nrow(cr))
cr<-diag(cr,x=0)

我希望将对角线的值设为零。似乎最后两行代码在我的情况下无法正常工作。

此外,我想使用a中的文件名,并将其保存为AB_Files_Whirr_127.csv。 我尝试过:

write.csv(cr,file = paste("CR_", a,".csv")

但是,我的目录中什么也没有显示。

CR的样例输出:

               Adrian Cole Alison Wong Andrei Savu Bruno Dumon Edward J. Yoon Eugene Koontz Jakob Homan Kelvin Kakugawa Kirk True Lars George Soren Macbeth Stu Hood
Adrian Cole               0           0           0           0              0             0           0               0         0           0             0        0
Alison Wong               0           0           0           0              0             0           0               0         0           0             0        0
Andrei Savu               0           0           1           0              0             0           0               0         0           1             1        0
Bruno Dumon               0           0           0           0              0             0           0               0         0           0             0        0
Edward J. Yoon            0           0           0           0              0             0           0               0         0           0             0        0
Eugene Koontz             0           0           0           0              0             0           0               0         0           0             0        0
Jakob Homan               0           0           0           0              0             0           0               0         0           0             0        0
Kelvin Kakugawa           0           0           0           0              0             0           0               0         0           0             0        0
Kirk True                 0           0           0           0              0             0           0               0         0           0             0        0
Lars George               0           0           1           0              0             0           0               0         0           1             1        0
Soren Macbeth             0           0           1           0              0             0           0               0         0           1             1        0
Stu Hood                  0           0           0           0              0             0           0               0         0           0             0        0
Tibor Kiss                0           0           0           0              0             0           0               0         0           0             0        0
Tom White                 0           0           1           0              0             0           0               0         0           1             1        0
Unassigned                0           0           0           0              0             0           0               0         0           0             0        0
                Tibor Kiss Tom White Unassigned
Adrian Cole              0         0          0
Alison Wong              0         0          0
Andrei Savu              0         1          0
Bruno Dumon              0         0          0
Edward J. Yoon           0         0          0
Eugene Koontz            0         0          0
Jakob Homan              0         0          0
Kelvin Kakugawa          0         0          0
Kirk True                0         0          0
Lars George              0         1          0
Soren Macbeth            0         1          0
Stu Hood                 0         0          0
Tibor Kiss               0         0          0
Tom White                0         1          0
Unassigned               0         0          0
1个回答

17

a不能用作输出文件的名称,因为它不是一个字符变量,而是一个数据框。

infile <- "Whirr_127.csv"
a <- read.table(infile, header=T, sep=",", row.names=1)
....
diag(cr) <- 0
write.csv(cr, file = paste0("CR_", infile, ".csv")

diag函数的语法对于新手来说可能看起来有些奇怪,但实际上它只是调用赋值函数diag<-的一种替代语法,即diag(x) <- 0被解释为diag<-(x, 0)

更新:多个文件

如果您想要对多个配对文件重复上述操作,可以这样做。

a.files <- grep("^Whirr", dir(), value=TRUE)
b.files <- paste0("Files_", a.files)
for(i in length(a.files)){
    a <- read.table(a.files[i], ...)
    b <- read.table(b.files[i], ...)
    ...
    write.csv(cr, paste0("CR_", a.files[i], ".csv"))
}

谢谢,对角线解决方案对我有用,但文件没有出现在我的工作目录中... - user1676484
我可能在你阅读帖子的同时进行了编辑。使用 paste0("CR_", infile, ".csv") 的解决方案肯定会奏效。如果不能,请确保 paste0 命令返回一个字符标量。 - Backlin
这只是一个简单的解决方案来进行诊断。我真是太傻了!不管怎样,假设我有多个文件,那就意味着我需要用文件路径替换infile(文件 = paste0("CR_", infile, ".csv"))吗?这样正确吗? - user1676484
做一个循环并在每次迭代中将infile设置为不同的文件。我怀疑这些文件是成对出现的,格式为“Whirr_###.csv”和匹配的“Files_Whirr_###.csv”,这样对吗? - Backlin
我尝试使用多个文件运行脚本,但是我得到了这个错误:Error in file(file, "rt") : cannot open the connection。 此外:Warning message: In file(file, "rt") : cannot open file 'Files_ Whirr_128.csv': No such file or directory。 - user1676484
现在它可以工作了。我必须使用paste而不是paste0。谢谢你的帮助。 - user1676484

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接