【发布时间】:2018-04-05 18:02:52
【问题描述】:
我需要从多个文件执行一系列计算,并使用所有文件的结果创建一个输出表。
我尝试列出文件夹中的所有文件并循环使用for 或lapply 函数,但我缺少一些东西。
这是我对一些“假”文件的简化对比:
# Create new folder -- "trials"
setwd("C:/Users/.../Desktop")
dir.create("trials")
# Create 'trial' files
setwd("C:/Users/.../Desktop/trials")
pathFiles <- "C:/Users/.../Desktop/trials"
df_1 <- data.frame(x=c(1,2,3,4,5,6,7,8,9,10))
df_1$y <- c(1,2,3,4,5,6,7,8,9,10)
df_1$z <- c(10,20,30,40,50,60,70,80,90,100)
write.table(df_1, "table1.csv", col.names = TRUE, row.names = FALSE, sep = ",")
df_2 <- data.frame(x=c(2,3,4,5,6,7,8,9,10,11))
df_2$y <- c(2,3,4,5,6,7,8,9,10,11)
df_2$z <- c(20,30,40,50,60,70,80,90,100,110)
write.table(df_2, "table2.csv", col.names = TRUE, row.names = FALSE, sep = ",")
df_3 <- data.frame(x=c(3,4,5,6,7,8,9,10,11,12))
df_3$y <- c(3,4,5,6,7,8,9,10,11,12)
df_3$z <- c(30,40,50,60,70,80,90,100,110,120)
write.table(df_3, "table3.csv", col.names = TRUE, row.names = FALSE, sep = ",")
对于这些文件中的每一个,我想提取某些信息并创建一个包含所有计算字段的输出表。
我已经尝试过 for 循环:
Final <- NULL
M <- NULL
slp <- NULL
eval <- NULL
dfs <- dir(pathFiles, "*.csv", full.names = TRUE, ignore.case = TRUE, all.files = TRUE)
for (df in dfs) {
t <- read.csv(df, header = TRUE, sep = ",")
x <- t$x
y <- t$y
z <- t$z
lim_y <- y >= 3 & y <=6
lim_x <- x[lim_y]
lim_z <- z[lim_y]
iFinal <- x[nrow(t)]
Final <- c(Final, iFinal) # add value to the string
iM <- mean(lim_z)
M <- c(M, iM) # add value to the string
p <- lm(lim_x ~ lim_z)
iSlp <- summary(p)$coefficients[2,1]
slp <- c(slp, iSlp) # add value to the string
ifelse ((Slp <= 0.05 & Slp >= -0.05), ieval <- "ok", ieval <- "false")
eval <- c(eval, ieval) # add value to the string
}
sum_df <- data.frame(df, M, Slp, eval, Final)
write.table(sum_df, "sum_df.csv", sep = ",", row.names = FALSE, col.names = TRUE)
我之前以类似的方式使用过这个for 循环,它工作正常,但在这里没有。
使用lapply 函数我没有得到更好的结果:
dfs <- list.files(pathFiles, "^.+\\.csv", full.names = TRUE, ignore.case = TRUE, all.files = TRUE)
Final <- NULL
M <- NULL
slp <- NULL
eval <- NULL
model <- function(x){
t <- read.csv(x, header = TRUE, sep = ",")
x <- t$x
y <- t$y
z <- t$z
lim_y <- y >= 3 & y <=6
lim_x <- x[lim_y]
lim_z <- z[lim_y]
iFinal <- x[nrow(t)]
Final <- c(Final, iFinal)
iM <- mean(lim_z)
M <- c(M, iM)
p <- lm(lim_x ~ lim_z)
iSlp <- summary(p)$coefficients[2,1]
slp <- c(slp, iSlp)
ifelse ((Slp <= 0.05 & Slp >= -0.05), ieval <- "ok", ieval <- "false")
eval <- c(eval, ieval)
}
lapply(dfs, model)
函数和输出表只适用于一个文件,所以我猜错误一定是我循环文件的方式。但我不知道我哪里出错了。
我将不胜感激。
【问题讨论】:
-
我刚刚运行了你的 for 循环,我看到的唯一问题是
slp和Slp的案例问题。在我调整之后,循环成功完成。否则,请检查以确保您定义pathFiles的方式是合法目录,并且您的文件确实存在于该目录中。 -
我按照您的建议进行了更改,但它对我不起作用。我收到以下错误消息:
Error in data.frame(df, M, Slp, eval, Final) : arguments imply differing number of rows: 1, 0。所有文件都在指定的目录中,所以不确定我做错了什么。 -
顺便说一句,很好的完全可重现的问题。它使快速尝试变得更容易。