【问题标题】:ddply with chunks from multiple data framesddply 来自多个数据帧的块
【发布时间】:2015-06-28 07:25:15
【问题描述】:

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 将按名称拆分数据帧列表,然后将每个数据帧的相应块传递给 netfun 函数。

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

谢谢

【问题讨论】:

  • 最简单的方法是newdf
  • 合并后,@jeremycg 显示您可以像这样使用ddply ddply(newdf, .(name), colwise(neatfun))

标签: r plyr


【解决方案1】:

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

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 选项应该与dplyr 中的left_join 做同样的事情。

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)                      

【讨论】:

  • 两个数据帧的每个块中的行数不一定相同,left_join 也不是“明智的”,因为两个数据帧中的任何行之间没有对应关系比这两个数据框有不同类型的关于每个家庭的信息。
  • 嗯,你能详细说明一下吗?据我所知,join 和 merge 做同样的事情(如果一个数据框中的每个名称都存在于另一个数据框中,那么 left_join 和内部连接之间没有区别)。对您的数据进行的快速测试显示,merge 和 left_join 给出了相同的结果。另外,我认为如果数据帧的行数不同也没关系,无论如何这都应该有效。
  • 我不需要(也不希望加入数据框块)。我所需要的只是一种从由相同分组变量拆分的两个不同数据帧创建块的方法,并将块对传递给函数,就像 ddply 一次从单个数据帧传递单个块一样。在对每个数据帧执行 ddply 并将结果合并在一起时,无法分解该函数。连接/合并让生活变得困难,因为现在某些块中的某些行在与其他数据框合并时会重复。
  • 例如,我可以使用“split”从每个数据帧创建一个块列表,但据我所知,没有简单的方法来确保列表的第一个元素来自每个数据帧的块现在“匹配”,除非两个数据帧在分组变量的值中是一致的。然后我可以使用每个列表的第一个元素、每个列表的第二个元素等循环遍历列表,但是有没有更优雅的方法?
猜你喜欢
  • 1970-01-01
  • 2019-12-04
  • 2019-08-20
  • 2019-05-29
  • 2020-12-12
  • 1970-01-01
  • 2021-12-23
  • 2020-07-26
  • 2018-05-30
相关资源
最近更新 更多