按组操作(group_by)在dplyr中没有分组。

5

好的,我已经阅读了这里的很多帖子,我有点尴尬,因为我以为我理解了基本的dplyr函数。

我无法使用group_by形成分组,我感到困惑。

我有数据框test。我只想按变量ID分组,然后计算每个组中两个变量之间的相关性。

我不知道发生了什么,因为它没有分组,并且只输出一个相关性,而我应该有127个组和127个相关性。为什么?

test长这样:

enter image description here

我写的内容:

library(dplyr)
library(magrittr)
test%>%
  mutate(ID=as.character(ID))%>%
  group_by(ID)%$%
  cor(sulfate,nitrate,use="complete.obs")

我得到的是:[1] 0.0568084

2
有多少个ID?也许只有一个。 - pogibas
2
我猜你需要比较生僻的dplyr动词“do”(如果我正确理解了你的预期输出)。你是正确的,magrittr对于“%$%”是必需的。 - Frank
1
@Emil,我不同意。我正在使用管道%>%运算符,但也使用了曝光%$%运算符,该运算符未预装在dplyr中。 - delcast
1
基于R的解决方案进行双重检查:by(test, test$ID, function(X) cor(X$sulfate, X$nitrate, use = "p"))。也许甚至可以复制到(但不是dplyr解决方案):在R中按组计算Spearman相关性 - pogibas
1
@delcast,那是我的错误...我从未遇到过%$%运算符。感谢您的问题,因为我们都得到了CalumYou的非常好的答案。 - Emil
显示剩余5条评论
1个回答

9
我认为,暴露管道符%$%不会自由地提供带有group_bydplyr语义。 虽然我还没有查看源代码,但是仅仅思考一下,你期望你的代码返回什么? 一个包含127个相关值的向量? 你甚至不知道哪个相关值来自哪个ID。 我建议您尽可能将操作封装在mutatesummarise中,这也是预期的用法。 请注意,这提供了与%$%相同的优势,即避免指定数据框上下文(例如,可以只写mpg而不是mtcars $ mpg)。 在这里,我不会使用do,因为没有必要(您的输出将成为向量,而不是更复杂的模型)。
以下是使用内置的mtcars数据集的示例。
如果您需要相关性向量,则很容易在此操作之后提取。
library(dplyr)

mtcars %>%
  group_by(gear) %>% 
  summarise(cor = cor(mpg, hp))
#> # A tibble: 3 x 2
#>    gear    cor
#>   <dbl>  <dbl>
#> 1     3 -0.739
#> 2     4 -0.879
#> 3     5 -0.900

这段文字是在2018年07月13日由 reprex包 (v0.2.0) 创建的。


是的!这个很好用。我猜它试图使用'exposition pipe'与'group_by'。我确实得到了我的127个相关性。谢谢! - delcast
很棒的解释! - Gregor Thomas

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