0

我想使用 mutate 将函数应用于嵌套/分组数据集的每一组。这个例子应该有助于解释目标。需要有关如何正确编码的建议。

制作一个分组/嵌套的假数据集。

data(kidney)
grp_kidney <- kidney %>% group_by(sex) %>% nest()

它具有以下结构:

> grp_kidney
# A tibble: 2 x 2
# Groups:   sex [2]
    sex data             
  <dbl> <list>           
1     1 <tibble [20 × 6]>
2     2 <tibble [56 × 6]>

接下来,我们制作一个函数来拟合这些数据的生存曲线。

sFit <- function(df, ci = 'none'){
  survfit(Surv(time, status) ~ age, data = df, conf.type = ci)
}

最后,我们将此函数应用于分组数据的每一行,并使用 purrr::map 和 dplyr::mutate 将结果保存为分组 tibble 中的新列。

grp_kidney <- grp_kidney %>%
  mutate(plain = map(grp_kidney$data, sFit, ci = 'plain')) %>%
  mutate(loglog = map(grp_kidney$data, sFit, ci = 'log-log'))

Error: Problem with `mutate()` input `plain`.
x Input `plain` can't be recycled to size 1.
ℹ Input `plain` is `map(grp_kidney$data, sFit, ci = "plain")`.
ℹ Input `plain` must be size 1, not 2.
ℹ The error occurred in group 1: sex = 1.
Run `rlang::last_error()` to see where the error occurred.

我希望在这个例子中得到的结果是一个嵌套的 data.frame,它具有以下特征:

  1. 每个分组变量元素一行(本例中为 2 行)
  2. Col 1:sex - 在本例中为 1 或 2
  3. Col 2: data - 每组的data.frame
  4. Col 3:plain - 带有普通 CI 的 survfit 模型的输出
  5. Col 4: loglog - 带有 log-log CI 的 survfit 模型的输出

如果我创建两个函数,一个用于“plain”,一个用于“log-log”,我就可以完成这项工作。这似乎是一种浪费,并且宁愿将参数传递给更广泛的函数。感谢任何编码专家的帮助。

布兰特

4

1 回答 1

1

我想我已经发现了我的错误并在下面进行了演示:

grp_kidney <- grp_kidney %>%
  mutate(plain = map(data, sFit, ci = 'plain')) %>%
  mutate(loglog = map(data, sFit, ci = 'log-log'))

这和我的原始代码之间的区别在于我使用data而不是引用数据的方式grp_kidney$data

于 2021-02-11T18:12:23.387 回答