将原始数据框的所有列添加到do的结果中

时间:2017-05-15 13:59:12

标签: r dplyr

代码

假设我有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)))))

问题

如果我想保留原始列,我会看到两种可能性:

  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>
    
  2. 添加一个人工id列并加入数据框(输出已剥离):

    left_join(mdat %>% mutate(id = 1:4), 
              ndat %>% ungroup() %>% mutate(id = 1:4), by = "id")
    
  3. 选项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,还是有更好的方法(在避免额外的列和硬编码列的意义上更好)?

0 个答案:

没有答案