【问题标题】:(R) for loop for a data frame not working(R) 数据框的 for 循环不工作
【发布时间】:2019-06-13 11:36:11
【问题描述】:

我正在尝试使用 for 循环创建数据框,因为我想在每次迭代时使用新元素更新数据框中的行。但是,只有最后一个值会打印到数据框中。

我尝试将不同的文件读入数据框,然后使用“cbind”将数据文件的条目号与文件中完整案例的数量相匹配。该代码适用于单个条目,但我无法让 for 循环将所有不同的行添加在一起;它似乎将第二次迭代复制到第一次迭代上,依此类推。

完整案例

complete <- function(directory, id) {

    fileList <- dir(directory, full.names = TRUE);
    frame <- data.frame();

    for (i in seq_along(id)) {

        data <- complete.cases(read_csv(fileList[i]));
        frame <- cbind(i, sum(data));
    }

}

因此,我想获得一个数据框,其中列出了指定目录中的不同文件以及完整案例的数量。你能告诉我我在这个 for 循环中做错了什么吗?

【问题讨论】:

    标签: r loops dataframe for-loop


    【解决方案1】:

    由于您总是在循环中覆盖您的数据帧frame,因此您也需要cbind

    complete <- function(directory, id) {
    
        fileList <- dir(directory, full.names = TRUE);
        frame <- data.frame();
    
        for (i in seq_along(id)) {
    
            data <- complete.cases(read_csv(fileList[i]));
            frame <- cbind(frame, i, sum(data));
        }
    
    }
    

    否则,您的 frame 会在每次新迭代时设置。所以如果你想把它添加到你的frame,你必须把frame也作为输入

    【讨论】:

    • 嗨,谢谢,这行得通。但是,将“ i ”添加到 cbind 命令不起作用。结果输出不是作为行索引的 ID 序列,而只是数据帧本身的索引。例如。当我输入 complete(directory, 5:20) 时,输出是一个编号从 1 到 16 的列表。如何解决这个问题以使行对应于正确的标识符?
    • @user2892481 很抱歉,我不明白您到底想要达到什么目的。您代码中的 i 当然是循环中的变量,仅此而已。如果您想在数据框中使用文件名,您可以轻松地使用fileList[i] 而不是 i,它会为您提供完整路径。之后,您可以使用 grep 或 trim 命令将文件路径剪切为文件名。这个网站上有很多关于这个的教程
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多