1

使用特定功能,我希望合并成对的数据帧,用于 R 目录中的多个配对。我正在尝试编写一个“for循环”来为我完成这项工作,虽然相关问题(例如将多个 data.frames 合并到一个带有循环的 data.frame 中)很有帮助,但我正在努力为这个特定的示例循环调整利用。

我的数据框以“<em>_df1.csv”或“</em>_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 程序员,并且已经碰壁了,所以任何帮助都将不胜感激。

4

1 回答 1

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)
于 2013-06-27T14:51:35.777 回答