dplyr:group_by和mutate变量无法调用均值/标准差函数

时间:2018-09-12 14:41:06

标签: r dplyr

很抱歉,标题有点令人费解,因为我不知道该怎么解释。基本上,我正在尝试使用dplyr突变 group%变量。但是,我遇到了一个问题,新的计算变量显示为数字,甚至在使用summary()时进行计算,但不允许我调用mean()sd()而不抛出出现以下错误:

Warning message:
In mean.default(., group_pct) :
  argument is not numeric or logical: returning NA 

以下是发生情况的一些示例。

data(mtcars)

mtcars %>% 
  group_by(cyl) %>% 
  mutate(group_pct = hp / sum(hp)) %>% 
  summary()

enter image description here

注意:通过summary()调用group_pct时,计算正确。

data(mtcars)

mtcars %>% 
  group_by(cyl) %>% 
  mutate(group_pct = hp / sum(hp)) %>% 
  mean(group_pct)

enter image description here

...但是当我在这里要求均值时,它无法完成功能。即使当我使用ungroup()和/或na.rm = TRUE时,该功能仍然无法使用。我不明白这里是什么问题。


编辑:为澄清起见,我希望做这样的事情...

mtcars %>% 
  group_by(cyl) %>% 
  mutate(group_pct = hp / sum(hp)) %>% 
  paste0('Words: ', mean(group_pct))

希望获得最终结果:

Words: 0.09375

...我认为我不能使用summarize(),因此从一开始就不包含它。对于给您带来的不便,我们深表歉意。

4 个答案:

答案 0 :(得分:4)

根据OP的说明:

mtcars %>% 
  group_by(cyl) %>% 
  mutate(group_pct = hp / sum(hp)) %>%
  pull(group_pct) %>%
  mean() %>%
  paste0("Words: ", .)

[1] "Words: 0.09375"

答案 1 :(得分:3)

您需要baseR函数Post

with()

您最初尝试的问题是mtcars %>% group_by(cyl) %>% mutate(group_pct = hp / sum(hp)) %>% with(paste0('Words: ', mean(group_pct))) [1] "Words: 0.09375" 不在全局环境中定义,因此当它无法在查找中找到它时,您会收到错误消息。

group_pct是一种语法糖,它告诉R在管道传递的数据帧环境中评估with函数调用。因此它将找到paste0()并返回您的预期结果。

答案 2 :(得分:1)

问题在于您如何使用mean函数。查看您的错误消息:

Warning message:
In mean.default(., group_pct)

您正在尝试获取管道数据帧的group_pct列的均值,但是发生的是mean正在接收整个管道数据帧(.代表管道的输出)和一个对象group_pct,该对象可能存在或可能不存在。

看看这个答案:https://stackoverflow.com/a/38475455/8366499

如果要在均值函数中对管道化的data.frame进行子集化,则需要使用花括号{},以便对均值的调用被视为表达式,而不是函数调用。然后,您可以根据需要子集.对象:

mtcars %>% 
    group_by(cyl) %>% 
    mutate(group_pct = hp / sum(hp)) %>% 
    {mean(.$group_pct)} %>%
    paste0('Words: ', .)

[1] "Words: 0.09375"

答案 3 :(得分:0)

library(tidyverse)
library(purrr)

mtcars %>% 
  mutate(group_pct = hp / sum(hp)) %>% 
  summarise_all(mean) %>%
  select(group_pct) %>%
  map(function(x) paste0(" Word ", x))

结果是:

"Word 0.03125"