在R中为多个数据帧应用相同的函数

时间:2015-10-29 14:55:52

标签: r

我是新用户,我遇到了代码问题。我有16个不同的数据帧,我想为每个数据帧应用相同的功能。然后,我想将所有结果放在新的数据帧中。 我写了这段代码,效果很好:

    df2012<-as.data.frame(cprop(wtd.table(database2012$year,database2012$nivvie_dec,weights=database2012$wprm),total=FALSE))
    df2012$annee<-"2012"
    df2011<-as.data.frame(cprop(wtd.table(database2011$year,database2011$nivvie_dec,weights=database2011$wprm),total=FALSE))
    df2011$annee<-"2011"
    df2010<-as.data.frame(cprop(wtd.table(database2010$year,database2010$nivvie_dec,weights=database2010$wprm),total=FALSE))
    df2010$annee<-"2010"
    df2009<-as.data.frame(cprop(wtd.table(database2009$year,database2009$nivvie_dec,weights=database2009$wprm),total=FALSE))
    df2009$annee<-"2009"
    df2008<-as.data.frame(cprop(wtd.table(database2008$year,database2008$nivvie_dec,weights=database2008$wprm),total=FALSE))
    df2008$annee<-"2008"
    df2007<-as.data.frame(cprop(wtd.table(database2007$year,database2007$nivvie_dec,weights=database2007$wprm),total=FALSE))
    df2007$annee<-"2007"
    df2006<-as.data.frame(cprop(wtd.table(database2006$year,database2006$nivvie_dec,weights=database2006$wprm),total=FALSE))
    df2006$annee<-"2006"
    df2005<-as.data.frame(cprop(wtd.table(database2005$year,database2005$nivvie_dec,weights=database2005$wprm),total=FALSE))
    df2005$annee<-"2005"
    df2004<-as.data.frame(cprop(wtd.table(database2004$year,database2004$nivvie_dec,weights=database2004$wprm),total=FALSE))
    df2004$annee<-"2004"
    df2003<-as.data.frame(cprop(wtd.table(database2003$year,database2003$nivvie_dec,weights=database2003$wprm),total=FALSE))
    df2003$annee<-"2003"
    df2002<-as.data.frame(cprop(wtd.table(database2002$year,database2002$nivvie_dec,weights=database2002$wprm),total=FALSE))
    df2002$annee<-"2002"
    df2001<-as.data.frame(cprop(wtd.table(database2001$year,database2001$nivvie_dec,weights=database2001$wprm),total=FALSE))
    df2001$annee<-"2001"
    df2000<-as.data.frame(cprop(wtd.table(database2000$year,database2000$nivvie_dec,weights=database2000$wprm),total=FALSE))
    df2000$annee<-"2000"
    df1999<-as.data.frame(cprop(wtd.table(database1999$year,database1999$nivvie_dec,weights=database1999$wprm),total=FALSE))
    df1999$annee<-"1999"
    df1998<-as.data.frame(cprop(wtd.table(database1998$year,database1998$nivvie_dec,weights=database1998$wprm),total=FALSE))
    df1998$annee<-"1998"
    df1997<-as.data.frame(cprop(wtd.table(database1997$year,database1997$nivvie_dec,weights=database1997$wprm),total=FALSE))
    df1997$annee<-"1997"
    df1996<-as.data.frame(cprop(wtd.table(database1996$year,database1996$nivvie_dec,weights=database1996$wprm),total=FALSE))
    df1996$annee<-"1997"
    df19962012<-rbind(df1996,df1997,df1998,df1999,df2000,df2001,df2002,df2003,df2004,df2005,df2006,df2007,df2008,df2009,df2010,df2011,df2012)

然而,它是一个很长的代码,我需要复制其他变量,如性别,教育水平和家庭结构而不是年...我使用lapply寻找更短的代码,但我所有的试验都失败了。有人知道缩短代码的方法吗?

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:2)

再次,请参阅我的评论以生成一个新示例,但以下内容应该是您问题的核心元素并且可以重现。慢慢走过每个部分,了解发生了什么。一般来说,你应该尽可能争取D.R.Y. code,并养成在你发现自己重复代码行时随时写small/simple functions的习惯:

制作两个“假”data.frames:

df1 <- data.frame(x = 1:10)
df2 <- data.frame(x = 11:20)

一个简单的“虚拟”函数h(x),而不是h(df),需要data.frame并通过获取数据框的现有y来创建新列x列并添加10

h <- function(df) {
  df$y <- df$x + 10
  df
}

找到模式df-any-number的所有对象并将其存储在dfs

dfs <- ls(pattern = "df[0-9]")
dfs

通过按名称(即lapply)搜索dfs而不是mget,并将功能h应用于每个人。最后,rbind结果通过do.call

do.call(rbind, lapply(mget(dfs), h))

#         x  y
# df1.1   1 11
# df1.2   2 12
# df1.3   3 13
# df1.4   4 14
# df1.5   5 15
# df1.6   6 16
# df1.7   7 17
# df1.8   8 18
# df1.9   9 19
# df1.10 10 20
# df2.1  11 21
# df2.2  12 22
# df2.3  13 23
# df2.4  14 24
# df2.5  15 25
# df2.6  16 26
# df2.7  17 27
# df2.8  18 28
# df2.9  19 29
# df2.10 20 30

有些帖子有助于指导您的理解:

答案 1 :(得分:1)

获取Dataframes列表:

yDF <- function(y) {
  db <- get(paste0("database", y))
  df <- as.data.frame(cprop(wtd.table(db$year,db$nivvie_dec,weights=db$wprm),total=FALSE))
  df$annee <- y
  df
}
years <- 1996:2012
L <- lapply(years, yDF)

... normaly我不是get()的朋友。 你也可以为长数据帧做rbind():

DF <- yDF(1996)
for (y in 1997:2012) DF <- rbind(DF, yDF(y))

答案 2 :(得分:0)

您可以执行类似complete_dataframe <- rbind(...)的操作,将所有数据框组合在一起,尤其是当它们有一个单独的列定义每个数据框时(此处为annee)。然后,您可以使用data.table包或dplyr包将功能应用于特定群组。

dplyr中,工作流程为

complete_dataframe %>% group_by(annee) %>% mutate(new_var = somefunction(columns_to_pass_into_function))

生成新变量,或

complete_dataframe %>% group_by(annee) %>% summarise(new_var = somefunction(columns_to_pass_into_function))

在组上创建汇总表。