问题描述
我想使用 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 将结果保存为分组标题中的新列。
grp_kidney <- grp_kidney %>%
mutate(plain = map(grp_kidney$data,sFit,ci = 'plain')) %>%
mutate(loglog = map(grp_kidney$data,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,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 具有以下特征:
- 每个分组变量元素占一行(本例中为 2 行)
- 第 1 列:性别 - 在此示例中为 1 或 2
- 第 2 列:数据 - 每个组的 data.frame
- 第 3 列:普通 - 带有普通 CI 的 survfit 模型的输出
- 第 4 列:loglog - 带有 log-log CI 的 survfit 模型的输出
如果我创建两个函数,一个用于“plain”,一个用于“log-log”,我就可以完成这项工作。这似乎是一种浪费,而是更愿意将参数传递给更广泛的函数。感谢任何编码专家的帮助。
布兰特
解决方法
我想我已经发现了我的错误并在下面演示:
grp_kidney <- grp_kidney %>%
mutate(plain = map(data,sFit,ci = 'plain')) %>%
mutate(loglog = map(data,ci = 'log-log'))
此代码与我的原始代码之间的区别在于我使用 data
而不是 grp_kidney$data
引用数据的方式。