为什么赢了';t dplyr::使用我的自定义函数总结工作?
我想在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
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