【问题标题】:how to pass the name of dataframe list inside a list using a loop in r如何使用r中的循环在列表中传递数据框列表的名称
【发布时间】:2016-01-28 13:12:00
【问题描述】:

我有一个数据框列表,我尝试在其中应用函数。我的函数应该迭代 3 次。每次迭代后,结果应保存在results 列表中。

我的数据框有数字内容和不同的列名,除了最后 6 列(同名)。

我的代码如下:

# suposse i have three df with the following names
myfirstdf 
myseconddf
mythirddf 

mydflist # a list containing 3 data frames
for (i in 1:3){
results[[i]] <- lapply(mydflist, function(x) {         
longdata <- ncol(x)-i
sum ( x[,1:longdata])
} )

names(results[[i]]) <- sprintf("results[[i]]", 1:length(results))
}

我想要做的是通过添加第 i 个迭代次数来访问每个数据帧的结果,例如: results$mydflist$myfirstdfi其中i将是迭代次数,所以results$mydflist$myfirstdf1。但是我的代码是results$results1$results1

【问题讨论】:

  • 除非我误解了什么,否则颠倒你的for循环和lapply的顺序可能更方便;即(1)构建一个接受“data.frame”的函数,迭代3次,每次添加一列并返回结果,(2)lapply你的函数在“mydflist”上。也许,一个例子mydflist 和想要的输出会有所帮助。
  • 我刚刚编辑了我的问题,希望更清楚

标签: r loops lapply


【解决方案1】:

您的代码生成一个长度为 3 的列表,即迭代次数,三个列表项中的每一个又是一个长度为 3 的列表,即mydflist 中的数据帧数。 但从配方上看

我想做的是通过以下方式访问每个数据帧的结果 添加第 i 个迭代次数,例如: results$mydflist$myfirstdfi 其中我将是迭代次数所以 结果$mydflist$myfirstdf1。

在你的问题中,我猜你真正想要的是一个长度为 9 的 flat 列表,其中包含每个迭代步骤的一个项目和mydflist 中的每个数据帧,命名为

“myfirstdf1”“myseconddf1”“mythirddf1”

“myfirstdf2”“myseconddf2”“mythirddf2”

“myfirstdf3”“myseconddf3”“mythirddf3”。

以下函数可以处理这两种情况:

iteration <- function( dfList, fnct, numberOfIterations, flat=TRUE )
{
  L <- list()

  for (i in 1:numberOfIterations){
    L[[i]] <- lapply( dfList, fnct, i )
    names(L[[i]]) <- paste0( names(dfList), i )
  }
  return( if (flat) unlist(L,recursive=FALSE) else L )
}

例子:

mydflist <- list(
  myfirstdf  = data.frame(matrix(1:20,4,5)),
  myseconddf = data.frame(matrix(1:12,2,6)),
  mythirddf  = data.frame(matrix(1:15,3,5))
)

f <- function(df,i)
{
  longdata <- ncol(df)-i
  sum(df[,1:longdata])
}

results      <- iteration(mydflist,f,4,FALSE)
results_flat <- iteration(mydflist,f,4)

(我已将迭代次数从 3 更改为 4,以避免与数据帧的数量混淆。) 这是结果列表results不是平坦的:

> results
[[1]]
[[1]]$myfirstdf1
[1] 136

[[1]]$myseconddf1
[1] 55

[[1]]$mythirddf1
[1] 78


[[2]]
[[2]]$myfirstdf2
[1] 78

[[2]]$myseconddf2
[1] 36

[[2]]$mythirddf2
[1] 45


[[3]]
[[3]]$myfirstdf3
[1] 36

[[3]]$myseconddf3
[1] 21

[[3]]$mythirddf3
[1] 21

[[4]]
[[4]]$myfirstdf4
[1] 10

[[4]]$myseconddf4
[1] 10

[[4]]$mythirddf4
[1] 6

请注意,迭代步数出现了两次。例如,第一个迭代步骤中第三个数据帧的结果是

> results[[1]]$mythirddf1
[1] 78

flat列表results_flat的名称中,迭代步数只出现一次:

> results_flat
$myfirstdf1
[1] 136

$myseconddf1
[1] 55

$mythirddf1
[1] 78

$myfirstdf2
[1] 78

$myseconddf2
[1] 36

$mythirddf2
[1] 45

$myfirstdf3
[1] 36

$myseconddf3
[1] 21

$mythirddf3
[1] 21

$myfirstdf4
[1] 10

$myseconddf4
[1] 10

$mythirddf4
[1] 6

例如第一个迭代步骤中第三个数据帧的结果是

> results_flat$mythirddf1
[1] 78

如果您想通过results$mydflist$mythirddf1 访问此结果,则构建一个组件列表results,如下所示:

> results <- list(mydflist=iteration(mydflist,f,4))

此列表results 的唯一组成部分是上面的列表results_flat, 它的名字是mydflist:

> results
$mydflist
$mydflist$myfirstdf1
[1] 136

$mydflist$myseconddf1
[1] 55

$mydflist$mythirddf1
[1] 78

$mydflist$myfirstdf2
[1] 78

$mydflist$myseconddf2
[1] 36

$mydflist$mythirddf2
[1] 45

$mydflist$myfirstdf3
[1] 36

$mydflist$myseconddf3
[1] 21

$mydflist$mythirddf3
[1] 21

$mydflist$myfirstdf4
[1] 10

$mydflist$myseconddf4
[1] 10

$mydflist$mythirddf4
[1] 6

【讨论】:

  • 我已经编辑并增强了我的答案。希望现在它包含所需的results
  • 编辑后的答案完美运行!谢谢!!请问:resultsresults_flat之间的区别仅在于我想访问每个列表吗?
猜你喜欢
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2012-06-06
  • 2014-08-31
  • 2020-05-23
  • 2021-08-12
  • 1970-01-01
相关资源
最近更新 更多