【问题标题】:R - iterate over list of filesR - 遍历文件列表
【发布时间】:2014-10-28 12:36:43
【问题描述】:

我有一个文件列表,其中包含一些我想读入 R 的数据,然后遍历每个文件进行一些计算。 到目前为止,我能够使用以下代码读取文件:

方法1

filenames<-list.files(pattern="*.txt")
mynames<-gsub(".txt$", "", filenames)
for (i in 1:length(mynames)) assign(mynames[i], read.table(filenames[i]))

但是,当我尝试将某些函数应用于“名称”时,它只会显示为 NULL

lapply(mynames,nrow)

我知道将文件直接读入列表会更容易

方法2

temp<-list.files(pattern="*.txt")
myfiles<-lapply(temp, read.table,skip="#")

然后对该列表执行 lapply lapply(myfiles,nrow),但这只会丢失有关哪个文件生成每个列表的信息。

有没有什么办法可以用任何一种方法来规避这种情况,以便继续跟踪关系列表文件?

谢谢

【问题讨论】:

  • 我会说names 是一个向量,而不是一个列表,你可以用is.list(names) 检查。顺便说一句,调用变量names不是一个好主意,因为它已经是R中的一个函数......
  • @CathG 谢谢,更正了我的名字。 is.list(mynames) 返回 FALSE,但即使我执行“mynames
  • @PedroA 试试这个df1 &lt;- data.frame(Col1=1:5, Col2=6:10); df2 &lt;- data.frame(Col1=rnorm(10), Col2=sample(10)); mynames1 &lt;- ls(pattern="^df\\d+"); sapply(mget(mynames1), nrow)

标签: r list file lapply


【解决方案1】:

对于方法 2,您可以轻松使用类似的东西

temp <- list.files(pattern = "*.txt")
myfiles <- lapply(temp, read.table, skip = "#")
names(myfiles) <- temp

names 属性以这种方式存储文件名,您不会因为新变量而使工作环境混乱。

所以当你想迭代内容时,你可以使用lapply(myfiles, function(.) nrow(.)),或者如果你需要同时迭代文件名和内容,你可以使用lapply(names(myfiles), function(.) nrow(myfiles[[.]]))

【讨论】:

    【解决方案2】:

    第一种方法,试试

      sapply(mynames,function(nameoffile){nrow(get(nameoffile))})
    

    【讨论】:

    • 有什么方法可以遍历几个名称文件吗?因为我可以有几个。
    • @CathG 另一个选项可能是sapply(mget(mynames), nrow)
    • @akrun,这对我不起作用:“mget(mynames) 中的错误:第一个参数无效”
    • @PedroA 如果mynames 是全局环境中的数据框对象,它将起作用。
    • @CathG 是的,为了获得dataframes,我会使用lapply。但是,在这里(我没有阅读帖子,只是浏览了您的回复),目的是获得nrowlapply 将其放入列表中,如果您需要矢量,则需要 unlist。但是sapply 会得到一个向量。
    猜你喜欢
    • 2016-09-19
    • 2014-09-26
    • 2020-09-06
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多