【问题标题】:R - lapply() versus assign() in while loopR - lapply() 与 while 循环中的 assign()
【发布时间】:2017-10-31 01:07:17
【问题描述】:

我想将一个大的.csv 读入 R。将它拆分为各种对象并分别处理它们会很方便。我设法通过一个while循环来做到这一点,将每十分之一分配给一个对象:

# The dataset is larger, numbers are fictitious

n <- 0

while(n < 10000){
  a <- paste('a_', n, sep = '')
  assign(a, read.csv('df.csv', 
                      header = F, stringsAsFactors = F, nrows = 1000, skip = 0 + n)))
  # There will be some additional processing here (omitted) 
  n <- n + 1000
}

是否有更类似于 R 的方式来执行此操作?我立刻想到了lapply。根据我的理解,每个对象都是列表的元素,然后我必须取消列出。 我对以下内容进行了尝试,但没有成功,我的列表只有一个元素:

A <- lapply('df.csv', read.csv, 
             header = F, stringsAsFactors = F, nrows = 1000, skip = seq(0, 10000, 1000))

我错过了什么?我该如何从这里开始?然后如何取消列出 A 并将列表中的每个元素指定为单独的 data.frame

【问题讨论】:

标签: r while-loop apply lapply


【解决方案1】:

如果您将 lapply 应用于单个元素,您将只有一个元素作为输出。

你可能想这样做:

a <- paste0('a_', 1:1000) # all your 'a's

A <- lapply(a,function(x){
  read.csv('df.csv', header = F, stringsAsFactors = F, nrows = 1000, skip = 0 + n)
})

对于 a 的每个元素,称为 x 因为它是我选择作为函数参数的名称,我执行你的命令。 A 将是结果列表。

编辑:正如@Val 在 cmets 中提到的,这里似乎不需要分配,所以我删除了它,如果一切正常,你最终会得到一个来自 csvs 的 data.frames 列表。

【讨论】:

  • 我不知道assign,我只是用lapply替换了循环
  • 很高兴知道您在示例中包含的功能。在这种情况下,我认为您不需要分配。
猜你喜欢
  • 2011-05-11
  • 2014-03-25
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2015-10-12
  • 2017-07-12
相关资源
最近更新 更多