简体   繁体   中英

how to nest a column into itself in tidyverse

library(tidyverse)

why does this produce a list column 'am':

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

but not:

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

Error: not compatible with STRSXP

I realize this is a bit of a contrived example, but it's relevant to what I'm working on. Does mutate not scope outside its environment?

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]>

has three rows, so any column you need has to have three elements, as well.

If you want the full am column for each row, you can either mutate rowwise, which will evaluate the mutate call separately for each row,

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]>

or without rowwise , just repeat the desired list for each row:

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]>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM