我需要从目录中打开文件(矩阵)并在每个目录上应用函数 pca 。它使用另一个函数 count_pc ,它被认为是逐步在矩阵中对齐的对角线,并将重新计算的PC1添加到上一个函数的表 pcs 中。一开始,我没有想到环境,所以 count_pca 因错误“未知变量”而崩溃。然后我试着这样做:
files <- list.files()
count_pc <- function(x, env = parent.frame()) {
diag(file[x:nrow(file),]) <- 0
diag(file[,x:nrow(file)]) <- 0
pcn <- prcomp(file, scale = FALSE)
pcn <- data.frame(pcn$rotation)
pcs <- cbind(pcs, pcn$PC1)
}
pca <- function(filename) {
file <- as.matrix(read.table(filename))
pc <- prcomp(file, scale = FALSE)
pc <- data.frame(pc$rotation)
pc1 <- pc$PC1
pcs <- data.frame(pc1)
for (k in 1:40) {
count_pc(k)
}
new_filename <- strsplit(filename, "_")[[1]][3]
print(pcs)
colnames(pcs) <- paste0(0:40, rep("_bins_deleted", 40))
write.table(pcs, file=paste(new_filename, "eigenvectors", sep="_"))
return(apply(pcs, 2, cor, y = pc1))
}
ldply(files, pca)
事实上, count_pc 不会因上述错误而崩溃,但不幸的是,它会因新错误而崩溃:
"colnames<-`(`*tmp*`, value = c("0_bins_deleted", "1_bins_deleted", :
'names' [41] attribute must be the same length as the vector [1]"
表示 count_pc 不会更改所需的变量。首先,我认为问题可能与使用sapply(1:40, count_pc)
有关,所以我用循环替换它。但它没有帮助。我还尝试在 pca 中使用environment(count_pc) <- environment()
,但它也没有帮助(以及将 count_pc 中的变量名称更改为env $'名称“)。我不知道该怎么做,谷歌搜索似乎没有帮助。