使用特定函数,我希望合并数据帧对,用于R目录中的多个配对。我正在尝试编写一个'for循环',它将为我完成这项工作,虽然Merge several data.frames into one data.frame with a loop等相关问题很有用,但我仍在努力为这种特殊用途调整示例循环。
我的数据框以“ _df1.csv”或“ _df2.csv”结尾。我希望合并到输出数据帧的每一对在文件名的存在时具有相同的数字(即543_df1.csv和543_df2.csv)。
我使用list.files命令为我目录中的两种文件类型创建了一个字符串,如下所示:
df1files <- list.files(path="~/Desktop/combined files” pattern="*_df1.csv", full.names=T, recursive=FALSE)
df2files <- list.files(path="="~/Desktop/combined files ", pattern="*_df2.csv", full.names=T, recursive=FALSE)
我想要应用以合并每对数据帧的函数和命令如下:
findRow <- function(dt, df) { min(which(df$datetime > dt )) }
rows <- sapply(df2$datetime, findRow, df=df1)
merged <- cbind(df2, df1[rows,])
我现在正试图将这些命令合并到一个for循环中,从以下几行开始,以防止我必须手动合并这些对:
for(i in 1:length(df2files)){ ……
我还不是一个强大的R程序员,而且已经碰壁了,所以任何帮助都会非常感激。
答案 0 :(得分:1)
我的直觉(我没有机会检查)是你应该能够做如下的事情:
# read in the data as two lists of dataframes:
dfs1 <- lapply(df1files, read.csv)
dfs2 <- lapply(df2files, read.csv)
# define your merge commands as a function
merge2 <- function(df1, df2){
findRow <- function(dt, df) { min(which(df$datetime > dt )) }
rows <- sapply(df2$datetime, findRow, df=df1)
merged <- cbind(df2, df1[rows,])
}
# apply that merge command to the list of lists
mergeddfs <- mapply(merge2, dfs1, dfs2, SIMPLIFY=FALSE)
# write results to files
outfilenames <- gsub("df1","merged",df1files)
mapply(function(x,y) write.csv(x,y), mergeddfs, outfilenames)