我是新用户,我遇到了代码问题。我有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
寻找更短的代码,但我所有的试验都失败了。有人知道缩短代码的方法吗?
非常感谢你的帮助!
答案 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))
在组上创建汇总表。