使用dplyr的summarise和group_by函数来获取唯一值

5
以下是一个代表性的例子:
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))

然而,代码唯一值只有一个。为什么直接返回该值不起作用?为什么需要将其包装在“unique”中?

谢谢!


求均值、中位数和标准差?summarise(Exp = mean(expected)) - user227710
我只想让它报告实际值。不是平均数、中位数或任何其他值。就那一个值。看我的例子。 - user1357015
因为您试图将一个向量(例如c(1,1,1))分配给单个值。 group_by 告诉 summarise 它应该只期望一个值。 在某些情况下,即使是 unique 也会因为这个逻辑而失败。 尝试 DF$expected <- 1:9 ; DF %>% group_by(code) %>% summarise(Exp = unique(expected))。但这主要是 dplyr 的无聊操作。例如,data.table 不在乎这个问题:library(data.table) ; setDT(DF)[, list(Exp = expected), by = code] - David Arenburg
@DavidArenburg:啊,你的意思是说我们应该使用“unique”函数。如果不是唯一的话,那么代码会崩溃,因为得到的向量长度会大于1? - user1357015
@r2evans,我已经提供了我想要的内容...在我的第二个例子中它是有效的。 - user1357015
显示剩余4条评论
1个回答

18

这是一个常见的错误。调试它的一种方法是在summarise调用中使用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

你看到发生了什么吗?你试图给一个单一组分配多个值。

一种解决方案是按照您所描述的使用unique。或者,如果您知道具有相同代码的所有行始终具有相同的预期值,则可以直接进行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
如果数据框很大,使用group_by比基于unique()的解决方案要快得多。

1
不错的回答。如果您确定它是唯一的/仅有一个值,那么Unique只在summarise内起作用,在这种情况下,expected[1]是另一个选项。 - Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接