gpt4 book ai didi

r - 使用 do 时保留列

转载 作者:行者123 更新时间:2023-12-04 02:06:37 28 4
gpt4 key购买 nike

代码

假设我有以下代码(我知道,在这种情况下,我可以使用简单的 do 而不是第二个 mutate (并跳过 rowwise() ),但这不是重点,就像在我的真实代码中一样第二个 do 有点复杂并且计算模型):

library(dplyr)
set.seed(1)
d <- data_frame(n = c(5, 1, 3))
e <- d %>% group_by(n) %>%
do(data_frame(y = rnorm(.$n), dat = list(data.frame(a = 1))))
e %>% rowwise() %>% do(data_frame(sum = .$y + .$n))

# Source: local data frame [9 x 1]
# Groups: <by row>

# # A tibble: 9 x 1
# sum
# * <dbl>
# 1 0.3735462
# 2 3.1836433
# 3 2.1643714
# 4 4.5952808
# 5 5.3295078
# 6 4.1795316
# 7 5.4874291
# 8 5.7383247
# 9 5.5757814

问题

如您所见,结果仅包含列 sum .

问题

有没有办法到 保留 来自 e 的原始列 没有 需要明确指定它们(如 e %>% do(data_frame(n = .$n, y = .$y, dat = .$dat, sum = .$y + .$n)) 中的 dplyr 还是我必须使用 purrrlyr::by_row ?(不是说我不喜欢 purrrlyr *,我只是想知道是否有直接的 dplyr)这样做的方式,我可能忽略了):
e %>% purrrlyr::by_row(function(x) x$y + x$n, .collate = "cols", .to = "sum")

*) 嗯,实际上有一个问题 purrrlyr::by_row :
e %>% purrrlyr::by_row(function(x) data_frame(sum = x$y + x$n, diff = x$y - x$n), 
.collate ="cols")

会产生专栏 sum1diff1我需要再次重命名才能获得 sumdiff ,它添加了另一行代码。

最佳答案

我几乎从不使用 do ,而是做 nest 的组合, mutatemap .

很难说在你的情况下会是什么样子,因为你的例子似乎没有完全说明你的需求。

在最简单的情况下,您可以指定您确实需要的变量(例如,如果它们是 S3 对象列表):

mutate(e, sum = map2_dbl(y, n, `+`))

或者,您可以嵌套所需的数据,然后映射整个数据。例如。:
f <- e
f$r <- 1:nrow(e) # i.e. add some other variable, not necessarily row indices

f %>%
ungroup() %>% # e was still grouped
nest(n:dat) %>% # specify what you variables you need
mutate(sum = map_dbl(data, ~.$y + .$n)) %>% # map to data, use the same formula as in do
unnest() # unnest to get original columns back

两者都保留原始列不变。

对于建模示例,例如:
mtcars %>% 
group_by(cyl) %>%
nest() %>%
mutate(model = map(data, ~lm(qsec ~ hp, .)),
coef = map_dbl(model, ~coef(.)[2])) %>%
unnest(data)

这将为您提供所有原始数据,但每组增加了回归系数。在取消嵌套之前,整个模型都在您的 data.frame 中作为列表列。

关于r - 使用 do 时保留列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44431209/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com