遍历子目录,重塑矩阵并在 R 中保存输出
Looping through subdirectories, reshaping matrix and saving output in R
我有一个项目文件夹 (project1),其中包含来自 20 个主题(Sub-001、Sub-002 等)的数据。每个受试者的文件夹都包含一个子文件夹(名为 AD),其中有一个 AD.csv 相关矩阵。
文件夹结构如下所示
├── Sub-001
│ └── AD
│ └── AD.csv
└── Sub-002
└── *
我想编写一个 for 循环,迭代进入每个主题的 AD 文件夹,将 AD.csv 矩阵从宽变为长,并将重塑后的矩阵保存为新的 subj_AD_reshaped.csv 文件,命名为在主题的 ID 之后(例如,Sub-001_AD_reshaped.csv),在主题的文件夹中。
我写的代码:
files<-list.files("group/S/project1/")
subjects<-list.dirs(path=files, full.names=T, recursive=F)
subj.AD<-subjects/"AD"
for (subj.AD in 1:length(subjects)) {
df<-read.csv("matrix.csv", sep="", header=F)
df.matrix<-as.matrix(df)
df.matrix[lower.tri(df.matrix)]<-NA
df.matrix.melt<-as.data.frame(reshape2::melt(df.matrix, na.rm=T))
write.csv(df.matrix.melt, file="subjects/Subject_AD_reshaped.csv))
}
此代码不起作用,主要是因为 R 似乎无法识别用于输入和输出的 AD 文件夹。编写此 for 循环的最佳方式是什么?
也许下面的代码可以解决问题。
base_path <- "group/S/project1"
subjects <- list.dirs(path = base_path, full.names = TRUE, recursive = FALSE)
for(s in subjects){
fl <- file.path(s, "AD", "AD.csv")
df1 <- read.table(fl, sep = ",")
df1.matrix <- as.matrix(df1)
is.na(df1.matrix) <- lower.tri(df1.matrix)
df2 <- as.data.frame(df.matrix)
df2.melt <- reshape2::melt(df2, na.rm = TRUE)
out_file <- paste0(basename(s), "_AD_reshaped.csv")
out_file <- file.path(s, out_file)
write.table(df2.melt, out.file, sep = ",", row.names = FALSE)
}
我有一个项目文件夹 (project1),其中包含来自 20 个主题(Sub-001、Sub-002 等)的数据。每个受试者的文件夹都包含一个子文件夹(名为 AD),其中有一个 AD.csv 相关矩阵。
文件夹结构如下所示
├── Sub-001
│ └── AD
│ └── AD.csv
└── Sub-002
└── *
我想编写一个 for 循环,迭代进入每个主题的 AD 文件夹,将 AD.csv 矩阵从宽变为长,并将重塑后的矩阵保存为新的 subj_AD_reshaped.csv 文件,命名为在主题的 ID 之后(例如,Sub-001_AD_reshaped.csv),在主题的文件夹中。
我写的代码:
files<-list.files("group/S/project1/")
subjects<-list.dirs(path=files, full.names=T, recursive=F)
subj.AD<-subjects/"AD"
for (subj.AD in 1:length(subjects)) {
df<-read.csv("matrix.csv", sep="", header=F)
df.matrix<-as.matrix(df)
df.matrix[lower.tri(df.matrix)]<-NA
df.matrix.melt<-as.data.frame(reshape2::melt(df.matrix, na.rm=T))
write.csv(df.matrix.melt, file="subjects/Subject_AD_reshaped.csv))
}
此代码不起作用,主要是因为 R 似乎无法识别用于输入和输出的 AD 文件夹。编写此 for 循环的最佳方式是什么?
也许下面的代码可以解决问题。
base_path <- "group/S/project1"
subjects <- list.dirs(path = base_path, full.names = TRUE, recursive = FALSE)
for(s in subjects){
fl <- file.path(s, "AD", "AD.csv")
df1 <- read.table(fl, sep = ",")
df1.matrix <- as.matrix(df1)
is.na(df1.matrix) <- lower.tri(df1.matrix)
df2 <- as.data.frame(df.matrix)
df2.melt <- reshape2::melt(df2, na.rm = TRUE)
out_file <- paste0(basename(s), "_AD_reshaped.csv")
out_file <- file.path(s, out_file)
write.table(df2.melt, out.file, sep = ",", row.names = FALSE)
}