为什么赢了';t dplyr::使用我的自定义函数总结工作?

为什么赢了';t dplyr::使用我的自定义函数总结工作?,r,dplyr,R,Dplyr,我想在dplyr的函数summary()中使用一个自定义函数,如下所示: library(dplyr) # Define custom function for calculating standard error se <- function(x) sd(x) / sqrt(length(x)) # Create a dummy data table with two groups d <- tibble(gp = sample(c("A", "B"), 20, replace

我想在dplyr的函数
summary()
中使用一个自定义函数,如下所示:

library(dplyr)

# Define custom function for calculating standard error
se <- function(x) sd(x) / sqrt(length(x))

# Create a dummy data table with two groups
d <- tibble(gp = sample(c("A", "B"), 20, replace = T),
            x = ifelse(gp == "A", rnorm(20), rnorm(20) + 1))

# Summarise data
d %>% 
  group_by(gp) %>%
  summarise(x = mean(x),
            se = se(x))

但是我不明白为什么第一个版本会给出这样的结果。

summary
依次计算每个表达式,所以当第一行计算时

x = mean(x)
x
列(每组内)由单个值替换,
mean(x)
。下一行对该常量
x
调用
sd
,单个值的
sd
NA

正如@joran在评论中所说的,如果你只是为你的平均值列选择一个不同的名称,一切都会起作用

d %>% 
  group_by(gp) %>%
  summarise(avg = mean(x),
            se = se(x))
# # A tibble: 2 × 3
#      gp        avg        se
#   <chr>      <dbl>     <dbl>
# 1     A -0.2879016 0.2264810
# 2     B  0.8804859 0.2625018
这被称为:

dplyr::mutate()
的工作方式与
plyr::mutate()
相同,与
base::transform()
类似。
mutate()
transform()
之间的关键区别在于mutate允许您引用刚刚创建的列


这是dplyr选择如何评估事物的“自然”结果。与之前的
x=mean(x)
相反,尝试
x1=mean(x)
…思考它的一种方式是,当它到达
se=se(x)
,dplyr必须决定“什么是
x
?”的答案。这个问题有几个“明显的”答案,但它选择的是您刚刚重新定义的版本,现在长度为1,所以没有标准偏差。我认为不使用
se
函数的版本不合理。因为,即使这样,它也会明白,
x
只是一个没有标准偏差的值。你能再检查一遍吗?@AntoniosK你完全正确,我在整理我的示例时很粗心。在我运行的版本中,我省略了x=mean(x)行,这当然是已经指出的关键行。我已经从问题中删除了这个例子!
x = mean(x)
d %>% 
  group_by(gp) %>%
  summarise(avg = mean(x),
            se = se(x))
# # A tibble: 2 × 3
#      gp        avg        se
#   <chr>      <dbl>     <dbl>
# 1     A -0.2879016 0.2264810
# 2     B  0.8804859 0.2625018
dd = data.frame(x = 1:3)
base::transform(dd, x = 0, y = x * 2)
#   x y
# 1 0 2
# 2 0 4
# 3 0 6

dplyr::mutate(dd, x = 0, y = x * 2)
#   x y
# 1 0 0
# 2 0 0
# 3 0 0