如何在R中双重“for循环”(第一个用于文件,第二个用于文件中的数据)

时间:2013-09-24 18:26:24

标签: r for-loop

我刚从R开始,我是一个自学成才的人,我的循环问题。 我正在寻找答案,但无处找不到任何东西。

我有很多不同名字的文件,而且我在一个文件中有很多数据。 我为一个文件做了一个循环,它运行良好 - 就像这样(但它有更多的计算):

12bielawica9.txt看起来像

NA  NA  NA  0.002   0.002   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
NA  NA  NA  0.008   0.006   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA

但它更大了

它包含研究结果,这就是为什么有很多NA的原因。 有时看起来不像是reasearches ....(NAs较少) 我也写在R

dane = dane = read.table("12bielawica9.txt", header=T)

for (i in dane) {
    x = sd(i, na.rm=T)
    y = length (na.omit(i))
    if (y == 0) {
        cat(file="12bielawica9.txt", append=T, (paste("-","\t")))
    } else if (x == "0") {
        cat(file="12bielawica9.txt", append=T, paste(format(mean(i, na.rm=T) - mean(i, na.rm=T), digits=5), "\t"))
    } else {
        cat(file="12bielawica9.txt", append=T, paste(format(t.test(na.omit(i), conf.level=0.90)$conf.int - mean(i, na.rm=T), digits=5), "\t"))
    }
}

首先,我想为所有文件创建一个循环,但是当我创建一个循环时:

myfiles <- list.files(pattern=".*txt")
for (j in 1:length(myfiles)) {
    for (i in myfiles[j]) {
        #LOOP FROM ABOVE
    }
}

现在, list.files返回我需要进行计算的每个文件(如12bielawica.txt)。 它清楚了吗?

R为每个文件返回一个结果(如联合)。我想为每个文件实现一个矩阵(比如我的第一个循环)。 我也不知道如何自动编写新文件...

我希望你理解我的意思。请不要严格要求我。

1 个答案:

答案 0 :(得分:1)

你很亲密。在您的问题中,您在第一个(内部)循环之前执行的操作将在文件中读取。

dane = read.table("12bielawica9.txt", header=T)

然后你的循环引用那个(for (i in dane))。当你将它包装在外部循环中时,你仍然需要读取东西:

myfiles <- list.files(pattern=".*txt")

for (j in 1:length(myfiles)) {
    this_file <- read.table(myfiles[j], header = T)
    for (i in this_file) {
        #LOOP FROM ABOVE
    }
}

应该使循环工作。

您还说要将输出存储在矩阵或其他内容中。你应该做的是初始化一个空矩阵来存储结果,然后让内循环插入结果。像

这样的东西
results_mat <- matrix(NA, nrow = 2, ncol = length(myfiles))
## 1st row will be x, second row will be y, 1 column per file

然后将内循环更改为

for (i in dane) {
    x = sd(i, na.rm=T)
    y = length (na.omit(i))
    results_mat[, j] <- c(x, y)
}

当然,您可以将此扩展到更多行以获得所有结果...我会留给您。您还可以执行colnames(results_mat) <- myfiles之类的操作,以便了解哪些结果与哪些文件相对应。