我有多个具有相同列但行数不同的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中的单个值,但一次不超过一个。
答案 0 :(得分:2)
我创建了一个框架代码来读取多个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