• R语言
  • 求助:R语言可否用数组的方式批量读入上千个有规律文件名txt文件。

如题,因为文件里的数据都是相同的字段。想以用3维数组的方式读取每个文件的数据并进行简单的求和运算。以文件名为维度,然后里面的数据为数据框。不知道如何实现。

可以

手上有段现成代码:

# list files with pattern
filel = list.files("../dataset/out/", pattern = "fix3_1.61*", full.names=TRUE)
# read all files into a list, each element is a data.frame
data.l = lapply(filel, data.table::fread)

    beginr 包开发版 (github: pzhaonet/beginr) 里有个函数,批量读入指定文件夹里的所有结构相同的文本文件,作为 list 或 data.frame ,而源文件的文件名作为 list 里的 name 或者 data.frame 的新列来存放:

    beginr::readdir()

    并没有读成三维数组。我觉得作为 list 或 data.frame 保存更为直观一些,后续处理也更方便,尤其是存为 data.frame 时,源文件名作为新列,这样就可以直接用 tapply() 以及 tidyr 的 gather()spread() 函数折腾了。

    谢谢一楼二楼两位大侠对小白的帮助,争取能吸收消化。

    6 天 后

    tctcab > as1=data.frame(id=1:5,zimu=LETTERS[seq(1,5)])

    as2=data.frame(id=6:10,zimu=LETTERS[seq(6,10)])
    qqq <- list(as1,as2)
    names(qqq) <- c('a','b')
    qqq
    $a
    id zimu
    1 1 A
    2 2 B
    3 3 C
    4 4 D
    5 5 E

    $b
    id zimu
    1 6 F
    2 7 G
    3 8 H
    4 9 I
    5 10 J

    qqq$a[1,1]+qqq$b[2,1] ## 请教:如何用lapply实现这个功能

      tctcab 如果list列表下元素个数不确定或者元素数量很大,不适合用for循环进行数据访问及操作,那么如何用lapply函数实现list列表下元素项下的数据操作。比如$a项下的【1,1】与$b项下的[2,1]跨元素相加;或者$a[1,1]+$a[2,1]这类的数据操作。不知道表述的是否清晰。

        dhfly
        单个list成员内部的操作倒是没问题,如果是多个成员的话稍微有点麻烦,得考虑边界情况的处理,比如你写的a[1,1]+b[2,1],在有a,b,c,d四个成员时d[1,1]要加什么呢?

          tctcab 请教,单个成员的$a[1,1]+$a[2,1]这种类型该如何写呢?简单的我也不会。

            dhfly

            data.l = list()
            data.l$a = matrix(rnorm(10),nrow= 5)
            data.l$b = matrix(rnorm(10),nrow= 5)
            data.l$c = matrix(rnorm(10),nrow= 5)
            
            data.l.result = lapply(data.l, function(x){
              return(x[1,1]+x[2,1])
            })
            
            data.l.result
            #> $a
            #> [1] -2.354201
            #> 
            #> $b
            #> [1] -1.333424
            #> 
            #> $c
            #> [1] -1.875295

            <sup>Created on 2019-01-15 by the reprex package (v0.2.1)</sup>

              tctcab 谢谢,难点就是自定义函数x为元素,这点我以为得用$引用。再次感谢!!!