tidyverse 的摘要中可以使用哪些功能?一个简单的例子失败了

问题描述 投票:0回答:1

我有一个数据框

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)
r dplyr
1个回答
0
投票
  1. f(samples %>% filter(sample_no == 1))
    在您的示例中不使用任何组

  2. 在您的示例中

    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
© www.soinside.com 2019 - 2024. All rights reserved.