首页 > 解决方案 > 创建csv文件列表,打开一个,遍历每一行,然后打开下一个并遍历每一行?

问题描述

我有多个具有相同列但行数不同的 csv 文件。对于每个 csv 列,我想获取 csv 文件的名称,打开它,获取文件的名称,然后根据“-”字符将一列分成两列。我对这个循环没有问题:

l <- list.files(".", full.names = TRUE)
for(i in length(l)){
    #Get the sample name form the name of the sheet
nm <- gsub("C:/Users/jmartin/Documents/20181130_Butte_Dust/tracking_sheets/","",l[[i]])
nm <- gsub(".csv","",nm)
df <- read.csv(paste(l[i]), stringsAsFactors = FALSE)
df.sep <- separate(data = df, col = MyColumn, into = c("start", "stop"), sep = "\\-")

这是我不知道如何进行的地方。我想对data.frame“df.sep”中的每一行重复以下步骤,然后去获取下一个csv文件,重复第一个循环以生成一个新的“df.sep”,然后对每个执行以下步骤该data.frame的行。请注意,“nm”来自上面的循环,“n”是现有列表。

for(j in nrow(df.sep)){
new <- paste(nm, " ", df.sep[j,3], df.sep[j,6], sep="")
old <- paste("X", df.sep[j,8], sep="")
n[which(n == paste(old))] <- paste(new)
}

本质上,我需要使用多个 csv 文件的某些列来重命名列表中的元素。我怎样才能让这两个循环一起工作?我可以让第二部分替换 n 中的单个值,但一次不超过一个。

标签: r

解决方案


我创建了一个框架代码来读取多个 csv 文件。您可以编辑 df.sep。我希望这有帮助。

# create a folder to save CSV files
myDirName = "folderCsv"
if(!dir.create(myDirName)){dir.create(myDirName)}

# loop to save files
set.seed(0)
maxNumFile = 2
for(ctFile in 1:maxNumFile){
  # create data
  numSample = 3
  df = data.frame(
    "col1" = paste0("X", floor(runif(n = numSample, min = 0, max = 10))),
    "col2" = floor(runif(n = numSample, min = 0, max = 10))
  )
  write.csv(x = df, file = paste0(myDirName, "/df", ctFile, ".csv"))
}

# prepare a list to save df.sep
lsdf.sep = vector(mode = "list", length = maxNumFile)

# open the CSV files
for(ctFile in 1:maxNumFile){ # Many R users prefer lapply to this For method.
  df.sep = read.csv(file = paste0(myDirName, "/df", ctFile, ".csv"), row.names = 1, stringsAsFactors = FALSE)
  df.sep$col1[df.sep$col1 == "X8"] = "new8"
  lsdf.sep[[ctFile]] = df.sep
}

lsdf.sep
# [[1]]
# col1 col2
# 1 new8    5
# 2   X2    9
# 3   X3    2
# 
# [[2]]
# col1 col2
# 1 new8    6
# 2   X9    0
# 3   X6    2

推荐阅读