2016-09-21 40 views
0

I list將一些數據幀(相同結構)添加到列表中以對每個數據幀執行lapply。但在lapply之後,我希望列表元素回到原始數據幀格式。如何將'list'函數反轉爲其原始輸入

除了循環之外,還有其他的功能嗎?

dt1<-data.frame(a=c(1,1,1),b=c(2,2,2)) 
dt2<-data.frame(a=c(3,3,3),b=c(4,4,4)) 
dt3<-data.frame(a=c(5,5,5),b=c(6,6,6)) 
lst<-list(dt1,dt2,dt3) 
for (i in 1:3) 
{ #after the data manipilaton 
assign(paste('newdt',i,sep=''),lst[[i]]) 
} 
> dt1 
    a b 
1 1 2 
2 1 2 
3 1 2 
> dt2 
    a b 
1 3 4 
2 3 4 
3 3 4 
> dt3 
    a b 
1 5 6 
2 5 6 
3 5 6 

期望輸出(I不包括數據操作部,從而所述輸出和輸入看起來相同)

> newdt1 
    a b 
1 1 2 
2 1 2 
3 1 2 
> newdt2 
    a b 
1 3 4 
2 3 4 
3 3 4 
> newdt3 
    a b 
1 5 6 
2 5 6 
3 5 6 
+3

這是更好地保持數據集在'list'而不是在全球環境 – akrun

+1

創建新的對象......我同意@akrun所說的。但從技術上講,'list2env'將會執行你描述的內容。 – joran

回答

1

使用sapply,操縱在環路中的每個數據幀,則返回它作爲一個名單。將列表重命名爲newdt-n,你應該很好走。

A <- sapply(1:length(lst), function(i){ 
     a_tmp <- list(lst[[i]]) 
     names(a_tmp) <- sprintf('newdt%s', i) 
     a_tmp 
    }) 

> names(A) 
[1] "newdt1" "newdt2" "newdt3" 

> class(A) 
[1] "list" 


> A 
$newdt1 
    a b 
1 1 2 
2 1 2 
3 1 2 

$newdt2 
    a b 
1 3 4 
2 3 4 
3 3 4 

$newdt3 
    a b 
1 5 6 
2 5 6 
3 5 6 

爲了簡潔起見......這裏是一些毫無意義的MANIP:

> A <- sapply(1:length(lst), function(i){ 
+  new_col <- lst[[i]] %>% mutate(sum_ab = a + b) 
+  a_tmp <- list(new_col) 
+  names(a_tmp) <- sprintf('newdt%s', i) 
+  a_tmp 
+ }) 
> A 
$newdt1 
    a b sum_ab 
1 1 2  3 
2 1 2  3 
3 1 2  3 

$newdt2 
    a b sum_ab 
1 3 4  7 
2 3 4  7 
3 3 4  7 

$newdt3 
    a b sum_ab 
1 5 6  11 
2 5 6  11 
3 5 6  11 
相關問題