如何使用 r 中的循环在列表中传递数据框列表的名称
how to pass the name of dataframe list inside a list using a loop in r
我有一个数据框列表,我尝试在其中应用函数。我的函数应该迭代 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
您的代码生成一个长度为 3 的列表,即迭代次数,并且三个列表项中的每一个都是长度为 3 的列表,即 mydflist
中的数据帧数。
但是从公式
What I want to do is to access to the results of each dataframe by
adding the ith number of iteration, something like:
results$mydflist$myfirstdfi where i will be the number of iteration so
results$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
,它是 not flat:
> 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
我有一个数据框列表,我尝试在其中应用函数。我的函数应该迭代 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
您的代码生成一个长度为 3 的列表,即迭代次数,并且三个列表项中的每一个都是长度为 3 的列表,即 mydflist
中的数据帧数。
但是从公式
What I want to do is to access to the results of each dataframe by adding the ith number of iteration, something like: results$mydflist$myfirstdfi where i will be the number of iteration so results$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
,它是 not flat:
> 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