1

我刚开始使用 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 不同......(有更少的 NA)我也在 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 为每个文件只返回一个结果(如合取)。因此,我想为每个文件实现一个矩阵(比如我的第一个循环)。我也不知道如何自动编写一个新文件......

我希望你明白我的意思。请不要对我严格。

4

1 回答 1

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这样您就可以知道哪些结果对应于哪些文件。

于 2013-09-24T19:20:21.023 回答