我在一个文件夹中有多个 .txt 文件,每个文件都有多个列。我想计算每个文件的第 2 列和第 7 列之间的 r 平方值,并将其打印到一个输出文件中。我尝试跟踪一个文件并且它有效:
y<- read.table("A4GALT_BLCA.txt", sep ="\t", header=T)
x<-lm(y[,2]~ y[,7])
summary(x)$r.squared
当我尝试使用 apply 或 for 循环对所有文件执行此操作时,它不起作用。
使用 for 循环:
filenames <- list.files("trial", pattern="*.txt", full.names=TRUE)
for (i in 1:length(filenames)) {y<- read.table(filenames[i], sep ="\t", header=T)
+ x<- lm(y[,2] ~ y[,7])
+ out<-summary(x)$r.squared
+ write.table(out, "test_out.txt", sep="\t")
+ }
这给出了一个文件作为输出,但其中只有一个值(对于最后一个文件)。我怎样才能即兴创作它以从所有文件中获取值。
谢谢
最佳答案
每次循环都会覆盖文件,这就是为什么最后只得到一行的原因。您可以每次向文件追加一个新行(使用 append=TRUE
)而不是覆盖它,但最好创建一个包含所有 r 平方值的数据框并将其写入归档一次。
此外,您不需要使用 lm
。对于两个变量,r平方就是相关系数的平方。
corr.data = data.frame(rsq=rep(NA,length(filenames)), file=rep(NA,length(filenames)))
for (i in 1:length(filenames)) {
y <- read.table(filenames[i], sep ="\t", header=T)
corr.data[i,1] <- cor(y[,2],y[,7])^2
corr.data[i,2] <- filenames[i]
}
write.table(corr.data, "test_out.txt", sep="\t")
你也可以使用 lapply
而不是显式循环:
corr.data = lapply(filenames, function(f) {
y <- read.table(f, sep ="\t", header=T)
data.frame(rsq=cor(y[,2],y[,7])^2, file=f)
})
corr.data = do.call(rbind, corr.data)
write.table(corr.data, "test_out.txt", sep="\t")
更新:引用您的评论,例如,这里是您如何获取每个文件中每对数字列的 r 平方并将它们保存到新文件中的方法。
library(reshape2)
corr.data = lapply(filenames, function(f) {
y <- read.table(f, sep ="\t", header=T)
# Remove non-numeric columns
y = y[ , sapply(y, is.numeric)]
# Calculate r-squared between every pair of columns
y = cor(y)^2
# Keep only upper triangle of r-squared matrix
y[!upper.tri(y)] = NA
# Melt to long format and remove NA
y = na.omit(melt(y))
})
corr.data = do.call(rbind, corr.data)
write.table(corr.data, "all_r_squareds.txt", sep="\t")
关于r - 为文件夹中的多个文件计算两列之间的 r 平方,并使用 R 将结果写入单个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39237522/