【问题标题】:Use a function of the data in dplyr::summarise使用 dplyr::summarise 中的数据函数
【发布时间】:2016-08-07 11:28:25
【问题描述】:

假设我有一个 data.frame 的函数,它返回一个数字,现在我想在 dplyr 中使用 summarise ,其中新变量应该是应用于 data.frame 分组的函数另一个变量。

这是一个愚蠢的例子

df <- data.frame(id=rep(c("A","B"),each=5),diff=rnorm(10))

func<-function(data){
  mean(data$diff)
}

我知道这个例子很容易使用summarise(Mean = mean(diff)) 完成,但重点不是解决这个例子,而是一般使用带有data.frame 函数的summarise

到目前为止我的尝试是

df %>% group_by(id) %>% summarise(New = func(.))

但它为每个组提供相同的值,这是整体功能。

希望一切都清楚。

【问题讨论】:

  • 用什么比较好?
  • 为什么不能是func &lt;- function(col) mean(col); df %&gt;% group_by(id) %&gt;% summarise(New = func(diff)) 或者使用[ 对数据进行子集化
  • @akrun 为什么在函数内部使用$不好?
  • 评估不正确
  • @akrun 因为一般来说它将是更多列的函数

标签: r dplyr


【解决方案1】:

我不确定我是否理解您要执行的操作,并且我不熟悉 plyr 和 dplyr 软件包之间的区别。做我认为你想做的最直接的方法是使用daply:

> daply(df, .(id), func)
         A          B 
-0.0301488  0.2088815

【讨论】:

  • 它有效,但最初的问题是dplyr,有没有办法用dplyr::summarise 做到这一点?
  • 我正在总结几个变量,到目前为止我已经使用了summarise,我不想将我的所有代码都更改为daply 逻辑
  • 这没有回答问题。 OP 明确声明他们想要使用 dplyr。当然,dplyr 有几种替代方案(有些效率很高,有些则没有),但这不是 OP 所要求的。 -1
  • @zwol 不,问题是dplyr::summarise
  • @eddi 说真的,如果问题文本询问特定的包功能并且问题具有相应的标签,我们应该避免编写建议其他包的答案。举一个极端的例子:当然,您可以在评论中建议使用 python 可以更轻松地完成此操作,但答案应该是使用 R。
【解决方案2】:

正如 akrun 在 cmets 中指出的那样,您可以在 dplyr 中使用 do 执行此操作:

df %>% group_by(id) %>% do(data.frame(New=func(.)))

您也可以添加其他变量,但必须使用.$:

df %>% group_by(id) %>% do(data.frame(New=func(.), SmthElse = sd(.$diff)))
#  id        New  SmthElse
#1  A  0.1934552 1.0932424
#2  B -0.4161216 0.4841031

也就是说,更简单、更快的性能解决方案是使用data.table:

library(data.table)
dt = as.data.table(df) # or convert in place using setDT

dt[, .(New = func(.SD), SmthElse = sd(diff)), by = id]
#   id        New  SmthElse
#1:  A  0.1934552 1.0932424
#2:  B -0.4161216 0.4841031

【讨论】:

    猜你喜欢
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多