代码
假设我有tibble
,其中包含原子向量和对象:
library(dplyr)
set.seed(1)
(mdat <- data_frame(n = 2:5, mod = rep(list(lm(rnorm(10) ~ 1)), 4)))
# # A tibble: 4 × 2
# n mod
# <int> <list>
# 1 2 <S3: lm>
# 2 3 <S3: lm>
# 3 4 <S3: lm>
# 4 5 <S3: lm>
现在我想使用do
创建一个新的data.frame
:
ndat <- mdat %>% rowwise() %>% do(data.frame(mod2 = I(list(lm(rnorm(.$n) ~ 1)))))
问题
如果我想保留原始列,我会看到两种可能性:
在do
调用中明确添加列:
(mdat %>% rowwise() %>%
do(data.frame(n = .$n, mod = I(list(.$mod)),
mod2 = I(list(lm(rnorm(.$n) ~ 1))))))
# Source: local data frame [4 x 3]
# Groups: <by row>
# # A tibble: 4 × 3
# n mod mod2
# * <int> <list> <list>
# 1 2 <S3: lm> <S3: lm>
# 2 3 <S3: lm> <S3: lm>
# 3 4 <S3: lm> <S3: lm>
# 4 5 <S3: lm> <S3: lm>
添加一个人工id
列并加入数据框(输出已剥离):
left_join(mdat %>% mutate(id = 1:4),
ndat %>% ungroup() %>% mutate(id = 1:4), by = "id")
选项1容易出错,因为我必须对mdat
的所有列进行硬编码。选项2引入了无意义的id
列。
我的问题是:我可以直接通过do
获得所需的输出吗?我的第一个想法是使用
mdat %>% rowwise() %>% do(data.frame(., mod2 = I(list(lm(rnorm(.$n) ~ 1)))))
但由于列mod
:
# Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) :
# cannot coerce class ""lm"" to a data.frame
所以我必须依赖选项2,还是有更好的方法(在避免额外的列和硬编码列的意义上更好)?