[英]Applying the same function for multiple dataframes in R
我是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
尋找了一個較短的代碼,但是我所有的嘗試都失敗了。 有人知道縮短代碼的方法嗎?
非常感謝您的幫助 !
同樣,請參閱我的評論以生成一個新示例,但是以下內容應成為您問題的核心要素,並且是可重復的。 慢慢地遍歷每個部分以了解發生了什么。 通常,您應該盡可能嘗試DRY代碼 ,並在發現重復的代碼行時養成編寫小型/簡單函數的習慣:
制作兩個“假” data.frames:
df1 <- data.frame(x = 1:10)
df2 <- data.frame(x = 11:20)
一個簡單的“虛擬”函數h(x)
,而不是h(df)
,通過獲取數據data.frame
的現有x
列並添加10
獲取一個data.frame
並創建一個新列y
。
h <- function(df) {
df$y <- df$x + 10
df
}
找到df-any-number
模式的所有對象,並將它們存儲在dfs
:
dfs <- ls(pattern = "df[0-9]")
dfs
通過按名稱(即mget
)搜索在dfs
運行lapply
,並對每個函數應用函數h
。 最后,通過do.call
rbind
結果。
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
一些有助於指導您理解的帖子:
有關數據框的列表:
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)
...通常我不是get()的朋友。 您還可以對較長的數據幀執行rbind():
DF <- yDF(1996)
for (y in 1997:2012) DF <- rbind(DF, yDF(y))
您可以執行諸如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))
在組上創建摘要表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.