R 编写循环以应用运算符';数据帧';多次

R 编写循环以应用运算符';数据帧';多次,r,csv,for-loop,dataframe,lapply,R,Csv,For Loop,Dataframe,Lapply,我想写一个循环,从一组已经存在的矩阵中创建多个数据帧。 我使用以下代码导入并创建了这些: temp<-list.files(pattern="*.csv") ddives <- lapply(temp, read.csv) d.dives1<- data.frame(ddives[1]) temp在我回答您的问题之前,请先了解一下术语: read.csv()的结果是一个data.frame lappy()的结果是一个列表 因此,您现在有了一个数据帧列表 如果您可以安全地假设

我想写一个循环,从一组已经存在的矩阵中创建多个数据帧。 我使用以下代码导入并创建了这些:

temp<-list.files(pattern="*.csv")
ddives <- lapply(temp, read.csv)
d.dives1<- data.frame(ddives[1])

temp在我回答您的问题之前,请先了解一下术语:

  • read.csv()
    的结果是一个
    data.frame
  • lappy()
    的结果是一个
    列表
  • 因此,您现在有了一个数据帧列表

    如果您可以安全地假设列表中的数据帧具有相同的结构(即相同的列数和相同的类),那么您可以使用
    rbind()
    将数据帧列表合并为一个
    data.frame

    为了简化此操作,您可以使用
    do.call()
    ,如下所示:

    do.call(rbind, ddives)
    
    do.call
    使用列表元素作为参数从函数构造调用。如果它们被命名,则作为命名参数传递,否则按顺序传递(在R中始终如此)。在这种情况下,将
    rbind
    应用于列表中的所有元素,从而创建一个
    data.frame



    这显然没有经过测试,因为我没有你的数据。但是,一般来说,
    do.call
    对于这种类型的操作是一个有用的函数。

    由于这是您先前发布的问题的后续,请尝试以下操作:

    for (i in 1:length(ddives)) assign(temp[i], ddives[[i]])
    

    如果您真的想要代码的循环版本,这将是:

    for (i in 1:length(ddives)){
      assign(paste("d.dives", i, sep =""), ddives[i])
    }
    

    ... read.csv不是已经返回了data.frame吗?不,很遗憾,使用这段代码,它刚刚返回了165个(我拥有的文件数)列表,我需要将这些列表转换为data frame。我非常怀疑它是否返回了165个列表。更可能的是,它返回1个列表,其中包含165个数据帧作为元素。ddives[[1]]将为您提供第一个数据帧,ddives[[2]]将为您提供第二个数据帧…如果您只想将它们放在单独的变量中,那么将其作为列表保存可能更明智、更有效…数据相关吗?您是否要对所有
    数据帧执行类似的操作?如果您是,那么将它们作为列表保存并熟悉
    apply
    函数系列可能会更好(正如@Dason指出的那样,效率更高)。我会小心地说
    do.call
    “将函数应用于列表”。它使用列表中的元素作为给定函数的参数。我认为用“将函数应用于列表”来描述
    lappy
    更为恰当。答案很好(而且投票率较高)。这是吹毛求疵,但由于我们对细节
    do.call
    使用列表元素作为参数从函数构造调用。如果它们被命名,它们将作为命名参数传递,否则按顺序传递,就像在
    R
    中一样。因此,对于
    mean
    函数的默认方法:
    函数(x,trim=0,na.rm=FALSE,…)
    产生不同的结果:
    do.call(“mean”,list(x=c(1:10,na),na.rm=TRUE))
    do.call(“mean”,list(x=c(1:10,na),TRUE))
    do.call(“mean”,list(c(1:10,na),na.rm=TRUE))
    @Joshua谢谢你。重新编辑答案(通过复制和粘贴文本)。如有必要,请随时进行编辑和改进。然后,您也可以使用DDIVE[[i]]——不需要其他任何废话,因为列表中的每个元素都应该已经是数据帧了。@Dason,我完全同意您的看法。这就是为什么我会这样回答。现在我只想回答这个问题。当我可以使用列表索引功能时,我不想让我的工作区充满165个文件。既然可以使用DDIVE[[i]],为什么还要使用data.frame(unlist(stuff))?“它应该做同样的事情,不是吗?”达森(拍着额头)。现在是印度的就寝时间。我已经编辑了我的答案。谢谢