【问题标题】:Creating functions in R with iterative code使用迭代代码在 R 中创建函数
【发布时间】:2014-03-14 10:30:41
【问题描述】:

我从事调查工作,并希望将大量表格(从数据框中绘制)导出到 .xlsx 或 .csv 文件中。我使用xlsx 包来执行此操作。这个包需要我规定excel文件中哪一列是表格的第一列。因为我想将多个表粘贴到 .csv 文件中,所以我需要能够规定表 n 的第一列是表的长度 (n-1) + x 个空格。为此,我计划创建如下值。

dt# 是通过将表格更改为数据框来制作的。

table1 <- table(df$y, df$x)
dt1 <- as.data.frame.matrix(table1)

在这里我为起始列的编号设置值

startcol1 = 1
startcol2 = NCOL(dt1) + 3
startcol3 = NCOL(dt2) + startcol2 + 3
startcol4 = NCOL(dt3) + 3 + startcol2 + startcol3

等等。我可能需要制作 50-100 张桌子。在 R 中有没有办法让这个过程成为一个迭代过程,这样我就可以创建 50 个起始列的值,而不必编写 50 多行代码,每行代码都建立在前一个之上?

我在堆栈溢出和其他博客上找到了关于编写 for - 循环或在 R 中使用应用类型函数的内容,但这似乎都是处理向量的操作,而不是向工作区添加值。谢谢

【问题讨论】:

    标签: r for-loop while-loop apply


    【解决方案1】:

    你可以使用类似这样的结构:

    您要阅读的文件列表:

    file_list = list.files("~/test/",pattern="*csv",full.names=TRUE)
    

    对于每个文件,读取和处理数据帧并捕获您正在读取/处理的帧中有多少列:

    columnsInEachFile = sapply(file_list,
           function(x)
           {
             df = read.csv(x,...) # with your approriate arguments
             # do any necessary processing you require per file
             return(ncol(df))
           }
    )
    

    列数加 1 的累积总和将表示包含您处理过的数据的数据框的起始列:

    columnsToStartDataFrames = cumsum(columnsInEachFile)+1
    columnsToStartDataFrames = columnsToStartDataFrames[-length(columnsToStartDataFrames)] # last value is not the start of a data frame but the end
    

    【讨论】:

      【解决方案2】:

      假设tab.lst 是一个包含表格的列表,那么你可以这样做:

      cumsum(c(1, sapply(tail(tab.lst, -1), ncol)))
      

      基本上,我在这里所做的是遍历所有表,但最后一个除外(因为一个人的起始列由倒数第二个确定),并使用ncol 获取每个表的宽度。然后我对该向量进行累积和以获得所有起始位置。

      这是我创建表格的方式(基于df 中所有可能的列组合的表格):

      df <- replicate(5, sample(1:10), simplify=F)     # data frame with 5 columns
      names(df) <- tail(letters, 5)                    # name the cols
      name.combs <- combn(names(df), 2)                # get all 2 col combinations
      tab.lst <- lapply(                               # make tables for each 2 col combination 
        split(name.combs, col(name.combs)),            #   loop through every column in name.combs
        function(x) table(df[[x[[1]]]], df[[x[[2]]]])  #   ... and make a table
      ) 
      

      【讨论】:

        猜你喜欢
        • 2021-05-11
        • 1970-01-01
        • 2014-04-30
        • 2018-10-03
        • 2017-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多