【问题标题】:Using for loops to match pairs of data frames in R使用 for 循环匹配 R 中的数据帧对
【发布时间】:2013-06-25 02:36:09
【问题描述】:

使用特定函数,我希望合并成对的数据帧,用于 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 程序员,并且已经碰壁了,所以任何帮助都将不胜感激。

【问题讨论】:

    标签: r for-loop merge


    【解决方案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)
    

    【讨论】:

    • 感谢以上。 dfs 使用 df1 和 df2 创建一个二元素列表矩阵,但 lapply(dfs, merge2) 命令表明缺少 df2 参数。我收到以下错误消息: lapply 中的错误(X = X,FUN = FUN,...):缺少参数“df2”,没有默认值。知道如何解决这个问题吗?
    • 以及如何使用编码中的 write.csv(data, "dataname.csv") 命令将列表矩阵中生成的合并数据帧保存为 csv 文件?
    • 谢谢,但我可以创建两个数据框列表的唯一方法是将您的代码重新排列为以下内容:lapply(df1files, function(x) read.csv)。然后这有效,但 mapply 命令仍然没有给我正确合并的数据集,即 df1 中的所有单元格现在都读取“NA”,我得到一个很大的数字。警告!
    • 在为每个合并对编写输出 csv 文件方面,我尝试将以下内容添加到 merge2 函数中:files &lt;- as.character(paste("file", ".csv", sep=""))followed write.csv(merged, files)。但是,我知道我缺少指向原始文件列表的链接。您介意为我提供解决方案吗?我尝试了不同的东西,但我无法让它工作。谢谢。
    • 我现在已经整理好了。该函数不喜欢因素,因此在读取数据帧列表时需要将stringsAsFactors=FALSE添加到命令中。 write.csv 命令当前会覆盖目录中的原始文件,但我可以更改它。感谢您的帮助!
    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多