在数据框列表中添加一列

时间:2014-06-23 13:16:56

标签: r dataframe

执行此代码后,我想在列表中的每个数据框中添加一列:

#list of my dataframes
df <- list(df1,df2,df3,df4)

#compute stats
stats <- function(d) do.call(rbind, lapply(split(d, d[,2]), function(x) data.frame(Nb= length(x$Year), Mean=mean(x$A), SD=sd(x$A)  )))

#Apply to list of dataframes
table <- lapply(df, stats)

这个我称之为Source的列,包括我的数据帧的名称以及Nb,Mean和SD变量。所以变量Source应该包含我的表[1]的df1,df1,df1 ......等等。

无论如何我可以在上面的代码中添加它吗?

1 个答案:

答案 0 :(得分:2)

这是一种不同的做事方式:

首先,让我们从一些可重现的数据开始:

set.seed(1)
n = 10
dat <- list(data.frame(a=rnorm(n), b=sample(1:3,n,TRUE)),
            data.frame(a=rnorm(n), b=sample(1:3,n,TRUE)),
            data.frame(a=rnorm(n), b=sample(1:3,n,TRUE)),
            data.frame(a=rnorm(n), b=sample(1:3,n,TRUE)))

然后,您需要一个向data.frame添加列的函数。显而易见的候选人是within。您要计算的特定事物是特定类别中每个观察的常数值。为此,请对要添加的每个列使用ave。这是你的新功能:

stat <- function(d){
    within(d, {
        Nb = ave(a, b, FUN=length)
        Mean = ave(a, b, FUN=mean)
        SD = ave(a, b, FUN=sd)
    })        
}

然后只需lapply到您的data.frames列表:

lapply(dat, stat)

如您所见,根据需要添加了列:

> str(lapply(dat, stat))
List of 4
 $ :'data.frame':       10 obs. of  5 variables:
  ..$ a   : num [1:10] -0.626 0.184 -0.836 1.595 0.33 ...
  ..$ b   : int [1:10] 3 1 2 1 1 2 1 2 3 2
  ..$ SD  : num [1:10] 0.85 0.643 0.738 0.643 0.643 ...
  ..$ Mean: num [1:10] -0.0253 0.649 -0.3058 0.649 0.649 ...
  ..$ Nb  : num [1:10] 2 4 4 4 4 4 4 4 2 4
 $ :'data.frame':       10 obs. of  5 variables:
  ..$ a   : num [1:10] -0.0449 -0.0162 0.9438 0.8212 0.5939 ...
  ..$ b   : int [1:10] 2 3 2 1 1 1 1 2 2 2
  ..$ SD  : num [1:10] 1.141 NA 1.141 0.136 0.136 ...
  ..$ Mean: num [1:10] -0.0792 -0.0162 -0.0792 0.7791 0.7791 ...
  ..$ Nb  : num [1:10] 5 1 5 4 4 4 4 5 5 5
 $ :'data.frame':       10 obs. of  5 variables:
  ..$ a   : num [1:10] 1.3587 -0.1028 0.3877 -0.0538 -1.3771 ...
  ..$ b   : int [1:10] 2 3 2 1 3 1 3 1 1 1
  ..$ SD  : num [1:10] 0.687 0.668 0.687 0.635 0.668 ...
  ..$ Mean: num [1:10] 0.873 -0.625 0.873 0.267 -0.625 ...
  ..$ Nb  : num [1:10] 2 3 2 5 3 5 3 5 5 5
 $ :'data.frame':       10 obs. of  5 variables:
  ..$ a   : num [1:10] -0.707 0.365 0.769 -0.112 0.881 ...
  ..$ b   : int [1:10] 3 3 2 2 1 1 3 1 2 2
  ..$ SD  : num [1:10] 0.593 0.593 1.111 1.111 0.297 ...
  ..$ Mean: num [1:10] -0.318 -0.318 0.24 0.24 0.54 ...
  ..$ Nb  : num [1:10] 3 3 4 4 3 3 3 3 4 4