我有一个数据框
samples
,它有 50 行,5 个样本每行 10 行。在此 df 中,样本编号由 sample_no
列标记。
我还有一个函数
f
,它获取样本并返回单行摘要数据框。当我写下:
samples %>%
group_by(sample_no) %>%
dplyr::summarise( d = f(.) ) %>%
unpack(cols = d)```
f
似乎可以一次查看所有样本(50 行),而不是一次查看一个样本(10 行)。相比之下
f(samples %>% filter(sample_no == 1))
如我所料看到 10 行。
是否只有某些特殊函数可以在 summarise 中使用,并且这些函数必须是“组感知”的?还是发生了其他事情?
MWE:
library(tidyverse)
SAMPLE_SIZE <- 10
NSAMPLES <- 5
fresh_sample <- function() {
data.frame(F = rnorm(SAMPLE_SIZE, 0, 1))
}
# I'd also love to know if there is a neater way to do this...
samples <- do.call(rbind, lapply(1:NSAMPLES, function(k) {
fresh_sample() %>% mutate(sample_no = k)
}))
# I don't actually need to compute dimensions.
# The actual computation I want to apply to a sample is much more complex.
dims <- function(sample) {
data.frame(nrow = nrow(sample), ncol = ncol(sample))
}
# This returns a 1-row df, with nrow = 10, ncol = 2
dims(samples %>% filter(sample_no == 1))
# This returns a 5-row df, each with nrow = 50, ncol = 2
samples %>%
group_by(sample_no) %>%
dplyr::summarise(d = dims(.)) %>%
unpack(cols = d)
f(samples %>% filter(sample_no == 1))
在您的示例中不使用任何组
在您的示例中
group_by
结果为 5 组。 summarize
中的代码应用于每个组,因此如果每组的所有行都可以汇总为一行,则任何结果都会为您提供 5 行。
它
group_by
将汇总/突变中的函数应用于所有组,因此您可以在其中使用的内容没有限制。
尝试取消分组
dims <- function(x) data.frame(nc = ncol(x), n = sum(x == 1))
samples %>% summarize(dims(.))
nc n
1 2 10