【问题标题】:dplyr summarise and group_by for unique valuesdplyr summarise 和 group_by 用于唯一值
【发布时间】:2015-06-08 15:10:28
【问题描述】:

这是一个有代表性的例子:

DF <- as.data.frame(matrix(data = 0, nrow = 9, ncol = 3))
colnames(DF) <- c("code", "actual", "expected")

DF$code <- letters[rep(1:3, each = 3)]
DF$actual <- runif(9, 3,5)
DF$expected <- rep(1:3, each = 3)

以下崩溃:

  DF %>%
  group_by(code) %>%
  summarise(Exp = expected)
 Error: expecting a single value

但是,以下工作:

DF %>%
  group_by(code) %>%
  summarise(Exp = unique(expected))

但是,代码的唯一值只是一个值。为什么不返回值工作?为什么我需要把它包在一个“独特的”中?

谢谢!

【问题讨论】:

  • 均值、中位数、标准差还是什么?summarise(Exp = mean(expected))?
  • 我只是想让它报告实际值。不是平均值,中位数或任何东西。就这一个值。看我的例子。
  • 因为你试图将一个向量分配给一个单一的值,比如c(1,1,1)group_by 告诉 summarise 它应该只期望一个值。在某些情况下,即使unique 也会因为这种逻辑而失败。试试DF$expected &lt;- 1:9 ; DF %&gt;% group_by(code) %&gt;% summarise(Exp = unique(expected))。但这主要只是dplyr 废话。比如data.table,顾不上library(data.table) ; setDT(DF)[, list(Exp = expected), by = code]
  • @DavidArenburg:啊,所以你说“独特”是要走的路。如果它不是唯一的,那么代码就会崩溃,因为结果向量会比一个长?
  • mutate 怎么样?

标签: r dplyr


【解决方案1】:

这是一个常见的错误。调试它的一种方法是在汇总调用中使用 paste()。

> DF %>% 
     group_by(code) %>% 
     summarise(Exp=paste(expected, collapse='-'))

Source: local data frame [3 x 2]

   code   Exp
  (chr) (chr)
1     a 1-1-1
2     b 2-2-2
3     c 3-3-3

你知道发生了什么吗?您正在尝试将多个值分配给单个组。

一种解决方案是使用您所描述的唯一性。或者,如果您知道具有相同代码的所有行始终具有相同的期望值,则可以直接 group_by:

> DF%>% group_by(code, expected) %>% summarise()
Source: local data frame [3 x 2]
Groups: code [?]

   code expected
  (chr)    (int)
1     a        1
2     b        2
3     c        3

如果dataframe很大,group_by会比基于unique()的方案快很多

【讨论】:

  • 不错的答案。如果您确定它是唯一的 / 只取一个值,则唯一性仅适用于汇总内部,在这种情况下,expected[1] 是另一种选择。
猜你喜欢
  • 2019-11-27
  • 1970-01-01
  • 2022-11-23
  • 2018-12-24
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
相关资源
最近更新 更多