R:读取并将多个csv文件写入循环,然后使用原始名称进行输出

时间:2017-01-15 20:31:19

标签: r csv dataframe export

道歉,如果这看似简单,但我无法在网站的任何地方找到可行的答案。 我的数据是csv形式,文件名是名称和编号。不像拥有通用词和增加数字的文件那么简单...... 我已经完成了我想用一个文件完成的工作,但问题是有几百个要做,所以每次更改名称都非常繁琐。

在此发布我的原始单批代码,希望有人可以缓解日益严重的搜索失败。

# set workspace
getwd()
setwd(".../Desktop/R Workspace")


# bring in original file, skipping first four rows
Person_7<- read.csv("PersonRound7.csv", header=TRUE, skip=4)

# cut matrix down to 4 columns
Person7<- Person_7[,c(1,2,9,17)]

# give columns names
colnames(Person7) <- c("Time","Spare", "Distance","InPeriod")

# find the empty rows, create new subset. Take 3 rows away for empty lines.
nullrow <- (which(Person7$Spare == "Velocity"))-3
Person7 <- Person7[(1:nullrow), ]

#keep 3 needed columns from matrix
Person7<- Person7[,c(1,3,4)]
colnames(Person7) <- c("Time","Distance","InPeriod")

#convert distance and time columns to factors
options(digits=9)
Person7$Distance <- as.numeric(as.character(Person7$Distance))
Person7$Time <- as.numeric(as.character(Person7$Time))

#Create the differences column for distance
Person7$Diff <- c(0, diff(Person7$Distance))

...whole heap of other stuff...

#export Minutes to an external file
write.csv(Person7_maxs, ".../Desktop/GPS Minutes/Person7.csv")

所以三部分问题如下:

  1. 我可以创建一个列表或向量来读取文件名,但不是每次都读取一个数据帧(如果这是一个很好的方法)。

  2. 整个代码中的变量名称需要更改而不仅仅是“Person1”“Person2”,它们更像是“Johnny1”“Lou23”。

  3. 需要将每个结果数据框导出到自己的原始名称的csv文件中。

  4. 采取任何和所有建议 - s.t.ruggling与这一个。 干杯!

1 个答案:

答案 0 :(得分:1)

考虑使用~200个数据帧的一个列表。不需要单独的命名对象充斥全局环境(尽管下面仍显示list2env)。因此,使用lapply()遍历工作目录的所有csv文件,然后只需将list的每个元素命名为file的basename:

setwd(".../Desktop/R Workspace")

files <- list.files(path=getwd(), pattern=".csv")

# CREATE DATA FRAME LIST
dfList <- lapply(files, function(f) {
      df <- read.csv(f, header=TRUE, skip=4)
      df <- setNames(df[c(1,2,9,17)], c("Time","Spare","Distance","InPeriod"))

      # ...same code referencing temp variable, df

      write.csv(df_max, paste0(".../Desktop/GPS Minutes/", f))
      return(df)
})

# NAME EACH ELEMENT TO CORRESPONDING FILE'S BASENAME 
dfList <- setNames(dfList, gsub(".csv", "", files))

# REFERENCE A DATAFRAME WITH LIST INDEXING
str(dfList$PersonRound7)    # PRINT STRUCTURE
View(dfList$PersonRound7)   # VIEW DATA FRAME
dfList$PersonRound7$Time    # OUTPUT ONE COLUMN

# OUTPUT ALL DFS TO SEPARATE OBJECTS (THOUGH NOT NEEDED)
list2env(dfList, envir = .GlobalEnv)