【问题标题】:In a *for* function, can I keep stacking values?在 *for* 函数中,我可以保持堆叠值吗?
【发布时间】:2018-11-14 00:32:09
【问题描述】:

我目前有很多具有相同字段但针对不同部门的 excel 文件。我正在尝试创建一个函数,该函数允许我从所有 excel 表中的“硫酸盐”字段中获取总平均值。

这是我目前拥有的代码:

Mean_Pollution<-function(directory,pollutant,id = 1:332){
  directory <- c("001","002","003","004")
  for (x in directory){
    print(paste("Reading",x,"file"))
    temp = read.csv(paste(directory.path,x,".csv",sep = ""))
    print(paste("Finished reading",x,"file"))
    i = print(mean(temp$sulfate,na.rm = TRUE))
  }
}

【问题讨论】:

  • 不确定“堆叠”是什么意思。看来您认为directory.path 将对向量directory 进行操作,从而为您提供一组路径。不是 R 的工作方式。学习使用list.files。我还认为约翰霍普金斯大学 Coursera 课程建议您使用他们的网站来解决家庭作业问题。尽管如此,您将能够通过搜索“[r] 污染物”找到许多已解决的 Coursera 作业问题。 (我刚刚找到了 290 个。)
  • 是的,确实,但我想完全理解代码。如果我可以将其应用于其他示例,这将是一个有用的工具。这就是我把它带到这里的原因,看看是否有一种方法,每次给出 X 平均值时,我都可以捕获该值并在以后使用它。
  • 您发布的代码没有数据集,也没有说明如何调用该函数或您可能会看到什么结果或错误。因此,在没有特定背景的情况下尝试为您提供建议没有多大意义。
  • 您的 Excel 工作表是如何组织的?你的目录叫什么名字? id 的论点是什么?你为什么要使用directory.path
  • 我投票决定将此问题作为题外话结束,因为这是一个课程作业问题,并且有很多关于 SO 的答案。在 SO 上搜索污染物会出现几个。

标签: r function for-loop mean


【解决方案1】:

您似乎拥有所需的一切,并且有很多这样的问题,但我将提供一个示例。这里的假设是所有内容都在 1 个文件夹中。我将使用我自己的文件夹:

setwd(dir = "C:/Users/Evan Friedland/Documents")
# Put some fake data in a fake folder
dir.create("Test_Folder")
setwd(dir = "C:/Users/Evan Friedland/Documents/Test_Folder")
n <- 5 # let's write 5 csv files
for(i in 1:n){
  write.csv(data.frame(madeupX = LETTERS[sample(1:24, 100, T)], sulfate = rnorm(100)), # fake data
            paste0(sprintf("%03d", i), ".csv")) # fake names
}
csvnames <- paste0(sprintf("%03d", 1:n), ".csv")

现在,要“堆叠”每个文件的平均值,您需要做的就是初始化一个空向量,循环遍历它们并将每个结果保存到向量的一个元素中。

means <- numeric(n) # intialize numeric type vector, n long
names(means) <- csvnames # name each element for fun
means <- sapply(1:n, function(x){ # used sapply instead of a for loop but either is fine
  cat("+ ",csvnames[x],"\n") # print which csv is running
  mean(read.csv(paste0(csvnames[x]))$sulfate) # return the mean of the sulfate col
  })
#+  001.csv 
#+  002.csv 
#+  003.csv 
#+  004.csv 
#+  005.csv 
means # print results
#[1]  0.007859499  0.077447995  0.048796633 -0.101449790 0.224429258

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多