簡體   English   中英

對R中的多個數據框應用相同的功能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM