我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
答案 0 :(得分: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
为了简洁起见......这里有一些毫无意义的操作:
> 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