2017-08-11 80 views
0

我的數據有點複雜。所以我使用mtcars數據集來說明我的問題。 做lm爲4cyl汽車和glm否則。將模型保存在名爲「模型」的列中。 現在我試圖提取模型類並將它們放在不同的列中。從r列表中提取模型的屬性

mtcars %>% group_by(cyl) %>% 
    do (model = if (mean(.$cyl)==4) lm(mpg~wt, data=.) else glm(vs~wt, data=., family='binomial')) %>% 
    mutate(model.class=attributes(model)$class) 

我得到的是下面的錯誤消息:

Error in mutate_impl(.data, dots) : Column `model.type` must be length 1 (the group size), not 2 

任何人都可以幫我嗎?非常感謝。

回答

1

class()函數比自己鑽研屬性要好。因爲一個對象可以有多個類,所以新列也需要成爲一個列表。

mtcars %>% group_by(cyl) %>% mtcars %>% group_by(cyl) %>% 
    do (model = if (mean(.$cyl)==4) lm(mpg~wt, data=.) else glm(vs~wt, data=., family='binomial')) %>% 
    mutate(model.class = list(class(model))) 
0

這裏是另一種選擇使用map函數從purrr包以提取class信息。

mtcars %>% 
    group_by(cyl) %>% 
    do (model = if (mean(.$cyl)==4) lm(mpg~wt, data=.) else glm(vs~wt, data=., family='binomial')) %>% 
    ungroup() %>% 
    mutate(model.class = map(model, class)) 

# A tibble: 3 x 3 
    cyl  model model.class 
    <dbl> <list>  <list> 
1  4 <S3: lm> <chr [1]> 
2  6 <S3: glm> <chr [2]> 
3  8 <S3: glm> <chr [2]> 
Warning message: 
glm.fit: fitted probabilities numerically 0 or 1 occurred