2016-09-21 43 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 
相关问题