0
library(tidyverse)

为什么这会产生一个列表列'am':

mtcars %>%
group_by(cyl) %>%
mutate(am=list(mtcars[,'am']))

但不是:

mtcars %>%
group_by(cyl) %>%
nest() %>%
mutate(am=list(mtcars[,'am']))

错误:与 STRSXP 不兼容

我意识到这是一个人为的例子,但它与我正在做的事情有关。mutate 的范围不超出其环境吗?

4

1 回答 1

2
mtcars %>% group_by(cyl) %>% nest()

## # A tibble: 3 × 2
##     cyl               data
##   <dbl>             <list>
## 1     6  <tibble [7 × 10]>
## 2     4 <tibble [11 × 10]>
## 3     8 <tibble [14 × 10]>

有三行,所以你需要的任何列也必须有三个元素。

如果您想要am每一行的完整列,您可以逐行改变,这将mutate分别评估每一行的调用,

mtcars %>% group_by(cyl) %>% nest() %>% rowwise() %>% mutate(am = list(mtcars$am))

## Source: local data frame [3 x 3]
## Groups: <by row>
## 
## # A tibble: 3 × 3
##     cyl               data         am
##   <dbl>             <list>     <list>
## 1     6  <tibble [7 × 10]> <dbl [32]>
## 2     4 <tibble [11 × 10]> <dbl [32]>
## 3     8 <tibble [14 × 10]> <dbl [32]>

或没有rowwise,只需为每一行重复所需的列表:

mtcars %>% group_by(cyl) %>% nest() %>% mutate(am = rep(list(mtcars$am), n()))

## # A tibble: 3 × 3
##     cyl               data         am
##   <dbl>             <list>     <list>
## 1     6  <tibble [7 × 10]> <dbl [32]>
## 2     4 <tibble [11 × 10]> <dbl [32]>
## 3     8 <tibble [14 × 10]> <dbl [32]>
于 2016-09-29T03:21:29.413 回答