ddply包含来自多个数据帧的块

时间:2015-06-27 19:52:26

标签: r plyr

ddply(和类似函数)如何处理多个数据帧。

例如,我有一个数据框,其中包含有关家庭中汽车的信息

car <- data.frame(name=c('aaa','aaa','bbb'), cars=c('honda','chevy','datsun'))

和第二个包含家庭成员的数据框

 people <- data.frame(name=c('aaa','bbb','bbb'), age=c(25,18,33))

我想申请一个功能

 neatfun <- function( car_chunk, people_chunk){ analysis with age and type of cars}

到相应的汽车和人群,

 analysis <- ddply( list(car,people), "name", neatfun)

其中ddply会按名称拆分数据帧列表,然后将每个数据帧的相应块传递给neatfun函数。

目前,我愿意假设每个“名字”出现在所有数据框中,所以我不必担心有汽车(但没有人)或有人(但没有汽车)的家庭。

由于

1 个答案:

答案 0 :(得分:0)

在不知道“某些分析”的确切含义的情况下,我可以看到一些方法可以继续。首先将数据合并到一个数据帧中。

library(dplyr)
> df <- left_join(car, people)
Joining by: "name"
> df
  name   cars age
1  aaa  honda  25
2  aaa  chevy  25
3  bbb datsun  18
4  bbb datsun  33

然后使用dplyr操作进行分析。

processed_df <- df %>% 
  group_by(name) %>% 
  ## do analysis here
  ## e.g. summarise, mutate, filter, top_n

如果你有一些更复杂的事情要做,并且你想拥有一个函数来说明数据帧,对它做一些事情,并吐出一个新的数据帧,你可以编写执行它的函数,将您的数据拆分成一个列表,将该函数应用于每个部分,然后将其保存在列表中,或者是否有意义将它们绑定在一起。

这假设我们从上面得到了相同的df,一个连接的数据帧。 (上面列出的merge选项应与left_join中的dplyr完全相同。

df_func <- function(df){  ## take in a dataframe, do stuff, return a dataframe
  ## some analysis
  return(df_new)
}
df_list <- split(df, df$name)  ## make a list of dataframes, 
                               ## where each element is a dataframe with the same name
df_new_list <- lapply(df_list, FUN = df_func)  ## apply function to each element
total_list <- rbind_all(df_new_list) ## put all the elements into a single dataframe
                                     ## rbind_all is a dplyr tool.
                                     ## otherwise you can use
total_list <- do.call(rbind, df_new_list)