在for循环中运行函数并将返回的数据帧添加到R中的列表中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在for循环中运行函数并将返回的数据帧添加到R中的列表中相关的知识,希望对你有一定的参考价值。

我有一个函数,它接受一个参数作为特定年份。此函数返回一个数据帧。现在我想创建一个多年的for循环,并将这些数据框添加到列表中或组合成一个大型数据帧。

这样的事情会有所帮助:

l <- list()
for (year in 2010:2017) {l <- functionX(subset(dataset, Year==year))}

它不起作用。我得到的错误是 -

较长的物体长度不是较短物体长度的倍数

我也试过调用函数:

functionX(subset(dataset, Year== 2010:2017))

这也不起作用。

编辑:

我认为因为每年数据帧的长度不一样,因此它们没有被添加。我做了一个小小的改变 -

for (i in 2010:2017) {
  df <- functionX(subset(dataset, Year==i))
  l[i] <- df$Name

  }

错误:要替换的项目数不是替换长度的倍数

我不是要替换,而只是尝试将每年特定数据帧的元素添加到列表中。

答案

我更新了您的示例以使其可重现。一般的想法如下:在for循环内,你把你的data.frame放在一个列表中。然后将该列表附加到大列表l。那样你的data.frame成为l列表中的一个元素:

l <- list()
functionX <- function(Year) {
  set.seed(Year)
  df <- data.frame(year=Year, x=rnorm(10))
  return(df)
}

for (year in 2010:2011) {
  l <- functionX(year) ## this will not error, but will just overwrite l on every loop
}

l
#>    year           x
#> 1  2011 -0.65480083
#> 2  2011 -0.02877456
#> 3  2011 -0.19413575
#> 4  2011 -0.90141523
#> 5  2011  1.31329723
#> 6  2011 -0.82243619
#> 7  2011 -0.25875645
#> 8  2011  0.23465318
#> 9  2011 -0.42060734
#> 10 2011 -0.63676356

l <- list()
for (year in 2010:2011) {
  new_l <- list(functionX(year)) ## this will put the resulting df as an element in a list
  l <- append(l, new_l)          ## this appends the lists together
  }

l
#> [[1]]
#>    year            x
#> 1  2010 -0.537472741
#> 2  2010 -0.005191135
#> 3  2010  1.005671811
#> 4  2010  0.214009870
#> 5  2010 -0.201253144
#> 6  2010  1.447430260
#> 7  2010 -0.539834711
#> 8  2010 -1.520636908
#> 9  2010  0.652780491
#> 10 2010  0.613471135
#> 
#> [[2]]
#>    year           x
#> 1  2011 -0.65480083
#> 2  2011 -0.02877456
#> 3  2011 -0.19413575
#> 4  2011 -0.90141523
#> 5  2011  1.31329723
#> 6  2011 -0.82243619
#> 7  2011 -0.25875645
#> 8  2011  0.23465318
#> 9  2011 -0.42060734
#> 10 2011 -0.63676356

reprex package创建于2018-08-02(v0.2.0.9000)。

另一答案

以下代码将执行您想要的操作。

首先,我将创建一个测试数据集,因为您尚未发布测试数据集。

set.seed(527)    # make the results reproducible
dataset <- data.frame(Year = sample(2000:2018, 100, TRUE), X = rnorm(100))

现在的功能。

functionX <- function(DF, years){
  res <- lapply(years, function(y) subset(DF, Year == y))
  names(res) <- years
  res
}

functionX(dataset, 2010:2017)

以上是关于在for循环中运行函数并将返回的数据帧添加到R中的列表中的主要内容,如果未能解决你的问题,请参考以下文章

如何制作 20 个数据帧的马赛克图并将它们放在 r 中的一页中?

如何从 for 循环返回多个具有唯一名称的 pandas 数据帧?

迭代 4 个 pandas 数据框列并将它们存储到 4 个列表中,其中一个 for 循环而不是 4 个 for 循环

列表未在 for 循环中重置

如何将 for 循环中的 .pkl 文件附加到 for 循环中创建的 pandas 数据帧?

R中多个数据帧的相同功能