首页 > 解决方案 > 将列添加到列表中具有相同列名但值不同的多个数据框中

问题描述

我在一个列表中有 n 个数据框,我想用不同的值和相同的名称填充新列。这是我做同样的尝试。

# here for example I have 5 data frames in the list called list.s
df1<- (data.frame(x=c(1.3,2.5,3.3,2.4,1.9),y=c( 9,11, 4,5,15), z=c(0.01,0.04,0.1,0.002,0.4)))
df2<- (data.frame(x=c(1.33,2.25,2.3,0.4,1.19),y=c( 2,22, 14,8,15), z=c(0.21,0.3,0.11,0.002,0.8)))
df3<- (data.frame(x=c(2.4,2.6,3.7,0.1,1.15),y=c( 10,11, 12,5,11), z=c(0.11,0.04,0.08,0.002,0.03)))
df4<- (data.frame(x=c(0.12,0.04,2.02,3.01,5.1),y=c( 5,11, 22,5,13), z=c(1.01,0.04,0.012,0.002,0.4)))
df5<- (data.frame(x=c(2.4,4.1,3.04,2.06,0.9),y=c( 6,21, 12,10,8), z=c(0.01,0.04,0.1,0.02,0.154)))
 list.s<- list(df1=df1,df2=df2,df3=df3,df4=df4,df5=df5)

# the names of the column which I want to add and fill 
 a<-paste0(c("a0","a1","a2","a3","a4","a5"),  rep(1:5,each=6)) 

 list.s[["df1"]]$a01<- 1
 list.s[["df1"]]$a11<- list.s[["df1"]]$x * list.s[["df1"]]$y
 list.s[["df1"]]$a21<- list.s[["df1"]]$z^2
 list.s[["df1"]]$a31<- list.s[["df1"]]$x^2
 list.s[["df1"]]$a41<- list.s[["df1"]]$y -list.s[["df1"]]$z 
 list.s[["df1"]]$a51<- list.s[["df1"]]$y +list.s[["df1"]]$x+list.s[["df1"]]$z
 list.s[["df1"]][, a[7:30]]<-0

 # now I want to add columns to the df2 
 list.s[["df2"]][,a[1:6]]<-0
 list.s[["df2"]]$a02<- 1
 list.s[["df2"]]$a12<- list.s[["df2"]]$x * list.s[["df2"]]$y
 list.s[["df2"]]$a22<- list.s[["df2"]]$z^2
 list.s[["df2"]]$a32<- list.s[["df2"]]$x^2
 list.s[["df2"]]$a42<- list.s[["df2"]]$y -list.s[["df2"]]$z 
 list.s[["df2"]]$a52<- list.s[["df2"]]$y +list.s[["df2"]]$x+list.s[["df2"]]$z
 list.s[["df2"]][, a[13:30]]<-0
  # again do the same and add columns to df3 
 list.s[["df3"]][,a[1:12]]<-0
 list.s[["df3"]]$a03<- 1
 list.s[["df3"]]$a13<- list.s[["df3"]]$x * list.s[["df3"]]$y
 list.s[["df3"]]$a23<- list.s[["df3"]]$z^2
 list.s[["df3"]]$a33<- list.s[["df3"]]$x^2
 list.s[["df3"]]$a43<- list.s[["df3"]]$y -list.s[["df3"]]$z 
 list.s[["df3"]]$a53<- list.s[["df3"]]$y +list.s[["df3"]]$x+list.s[["df3"]]$z
 list.s[["df3"]][, a[19:30]]<-0

 # again the same for df4
 list.s[["df4"]][,a[1:18]]<-0
 list.s[["df4"]]$a04<- 1
 list.s[["df4"]]$a14<- list.s[["df4"]]$x * list.s[["df4"]]$y
 list.s[["df4"]]$a24<- list.s[["df4"]]$z^2
 list.s[["df4"]]$a34<- list.s[["df4"]]$x^2
 list.s[["df4"]]$a44<- list.s[["df4"]]$y -list.s[["df4"]]$z 
 list.s[["df4"]]$a54<- list.s[["df4"]]$y +list.s[["df4"]]$x+list.s[["df4"]]$z
 list.s[["df4"]][, a[25:30]]<-0

 # and finally do the same for the df5
 list.s[["df5"]][,a[1:24]]<-0
 list.s[["df5"]]$a05<- 1
 list.s[["df5"]]$a15<- list.s[["df5"]]$x * list.s[["df5"]]$y
 list.s[["df5"]]$a25<- list.s[["df5"]]$z^2
 list.s[["df5"]]$a35<- list.s[["df5"]]$x^2
 list.s[["df5"]]$a45<- list.s[["df5"]]$y -list.s[["df5"]]$z 
 list.s[["df5"]]$a55<- list.s[["df5"]]$y +list.s[["df5"]]$x+list.s[["df5"]]$z

我可以在一个代码中执行此操作,而不是分别重复和填写它们在这方面有什么帮助吗?

标签: r

解决方案


我们可以使用map2循环listsplit名称并根据表达式分配列

library(dplyr)
library(purrr)
map2(list.s, split(a, substring(a, nchar(a))), ~
     .x %>%
       mutate(!! .y[1] := 1, !!.y[2] := x * y,  !!.y[3] := z^2,
            !! .y[4] := x^2, !!.y[5] := y - z, !!.y[6] := y + x + z))

如果我们更改map2map2_dfr它将创建一个数据集,同时填充其余不存在的列NA


另一种选择是使用Mapfrombase R

lst1 <- split(a, substring(a, nchar(a)))
i1 <- cumsum(lengths(lst1)) + 1
list.sModified <-  Map(function(dat, nm, ind) {

           dat[nm] <- cbind(1, dat$x * dat$y,
              dat$z^2, dat$x^2, dat$y - dat$z, dat$y + dat$x + dat$z)
           print(a[min(ind, length(a)):length(a)])
           dat[a[min(ind, length(a)):length(a)]] <- 0
           dat   

        }, 

         list.s, lst1, i1 )

推荐阅读