2016-09-21 3 views
0

I list 일부 데이터 프레임 (동일한 구조)을 목록으로 사용하여 각 데이터 프레임에 lapply을 수행합니다. 하지만 lapply 후 원래 데이터 프레임 형식으로 다시 목록 요소를 원한다.'목록'기능을 원래 입력으로 역전시키는 방법

루프를 제외한 다른 기능이 있습니까?

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 

원하는 출력 (출력 및 입력은 동일한 모양 그래서 데이터 조작부를 포함하지 않은)

> 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

오히려 지구 환경 – akrun

+1

의 새로운 개체를 만드는 것보다'list'의 데이터 세트를 유지하는 것이 좋습니다 ... 나는 @akrun이 말한 것에 동의한다. 그러나 기술적으로 말해서,'list2env'는 당신이 묘사하는 것을 할 것입니다. – joran

답변

1

사용 sapply, 루프의 각 데이터 프레임에 조작 A와 반환 명부. 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 
관련 문제