2016-01-28 36 views
0

我有一个数据帧的列表,我尝试应用函数。我的函数应该重复3次。每次迭代后,结果应保存在results列表中。如何通过r中的循环传递列表中的数据帧列表的名称

我的数据框有数字内容和不同名称的列,除了最后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

+0

除非我误解了某些东西,否则倒换'for'循环和'lapply'的顺序可能会更方便;即(1)构建一个接收“data.frame”的函数,迭代3次,每次添加一列,并返回结果,(2)'lapply'你的函数通过“mydflist”。也许,一个'mydflist'和想要的输出例子会更好。 –

+0

我刚刚编辑了我的问题,希望更清楚 – mina

回答

1

你的代码产生一个长度为3的列表,这个迭代的数量和这三个列表项中的每一个都是长度为3的列表,即mydflist中的数据帧的数量。 但是从配方

我想要做的是 来访问每个数据帧的结果将迭代的第i个数字,是这样的: 结果$ mydflist $ myfirstdfi在那里我会的数量迭代所以 结果$ mydflist $ myfirstdf1。

在你的问题

我猜你真正想要的是长度为9的列表,包含每一件每个迭代步骤和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,以避免与dataframes的数目混乱) 这里是结果列表results,这是不是 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 

平坦列表的名称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 
+0

我已编辑并增强了我的答案。希望现在它包含所需的结果。 – mra68

+0

编辑的答案完美的作品!谢谢!!我可能会问:“结果”和“results_flat”之间的区别只有当我想访问每个列表时? – mina

相关问题