r - 为文件夹中的多个文件计算两列之间的 r 平方,并使用 R 将结果写入单个文件

标签 r for-loop

我在一个文件夹中有多个 .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/

相关文章:

python - 如何在 for 循环中注释类型?

arrays - 退出代码 101 使用 &array 遍历数组

r - 如何从 predict() 的输出中得到真阳性、假阴性表?

r - 如何修复 ggnewscale 中的图例顺序

R 根据多个条件与 data.frame 相交

bash - 循环遍历未知数量的具有渐进名称的文件夹

java - 几乎递增序列java

r - 如何在ggplot中制作虚线、双虚线和实线

r - 在R中将数值矩阵缩放为0到1

ios - for循环不会执行