【问题标题】:R loop perform function on multiple csv filesR循环对多个csv文件执行功能
【发布时间】:2016-04-16 05:43:16
【问题描述】:

我尝试创建一个 for 循环,该循环对 4 个与此类似但包含更多文件的 csv 文件中的每一个执行某些操作。

dat1<- read.csv("female.csv", header =T)
dat2<- read.csv("male.csv", header =T)

for (i in 1:2) {
  message("Female, Male")
  Temp <- dat[i][(dat[i]$NAME == "Temp"), ]
  Temp <- Temp[complete.cases(Temp)]
  print(mean(Temp$MEAN))

但是,我得到一个错误:

Temp$MEAN 中的错误:$ 运算符对原子向量无效

不知道为什么这不起作用。对于遍历 csv 文件的任何帮助将不胜感激!

【问题讨论】:

  • 你在 for 循环中的结束 } 在哪里?
  • dat[1]dat 的第一个元素。 dat1 是另一个对象!
  • 读取多个文件的最佳方法可能是将它们放在一个列表中。示例见以下链接:stackoverflow.com/questions/19501040/…

标签: r csv


【解决方案1】:

就个人而言,我认为最简单的方法是使用 plyr 包:

library(plyr)
myFiles <- c("male.csv", "female.csv")
dat <- ldply(myFiles, read.csv)
dat <- dat[complete.cases(dat), ]
mean(dat$MEAN)

它的工作方式是首先创建一个文件名向量。然后 ldply() 函数对文件名向量执行函数 read.csv(),并将输出自动转换为 data.frame。然后你按照通常的方式完成 complete.cases() 和 mean()。

编辑:

但是如果你想要每个文件的平均值,那么这里有一种方法:

# create a vector of files
myFiles <- c("male.csv", "female.csv")  

# create a function that properly handles ONLY ONE ELEMENT
readAndCalc <- function(x){            # pass in the filename
   tmp <- read.csv(x)                  # read the single file
   tmp <- tmp[complete.cases(tmp), ]   # complete.cases()
   mean(tmp$MEAN)                      # mean
}

x <- "male.csv"
readAndCalc(x)                         # test with ONE file

sapply(myFiles, readAndCalc)           # run with all your files

它的工作方式是首先创建一个文件名向量,就像以前一样。然后你创建一个函数,一次只处理一个文件。然后,您可以使用刚刚创建的 readAndCalc 函数测试该函数是否有效。最后使用 sapply() 函数对所有文件执行此操作。希望对您有所帮助。

【讨论】:

  • 我看你是R的初学者。我在学习R的时候也遇到了同样的问题。在您开始“以 R 方式思考”之前,这是正常的。不用担心。你很快就会明白的。
  • 谢谢,这可行,但它似乎合并了所有文件。我想为每个文件获得单独的输出。这就是为什么我想循环遍历它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 2019-08-04
  • 2015-10-25
相关资源
最近更新 更多