修改/添加列到嵌套的小标题

Uma*_*mao 3 nested r tibble

我有一个带有变量/列的小标题,其中包括不同形状的小标题列表。我想向其中一个变量中的每个(子)tibble 添加一个变量/列。

例如这样的数据

library("tibble")
aaa <- tibble(qq = c(1,2,3),
              ww = list(tibble(a = c(1,2), s = c("as", "df")),
                        tibble(a = 3, s ="q"),
                        tibble(a = 4, s = "e")),
              ee = list(tibble(a = c(1,2), s = c("as", "df")),
                        tibble(a = c(3,6), s = c("qz", "wz")),
                        tibble(a = 4, s = "ez")))
Run Code Online (Sandbox Code Playgroud)

看起来像:

 > aaa
# A tibble: 3 x 3
     qq ww               ee              
  <dbl> <list>           <list>          
1  1.00 <tibble [2 × 2]> <tibble [2 × 2]>
2  2.00 <tibble [1 × 2]> <tibble [2 × 2]>
3  3.00 <tibble [1 × 2]> <tibble [1 × 2]>
Run Code Online (Sandbox Code Playgroud)

> aaa$ee
[[1]]
# A tibble: 2 x 2
      a s    
  <dbl> <chr>
1  1.00 as   
2  2.00 df   

[[2]]
# A tibble: 2 x 2
      a s    
  <dbl> <chr>
1  3.00 qz   
2  6.00 wz   

[[3]]
# A tibble: 1 x 2
      a s    
  <dbl> <chr>
1  4.00 ez   
Run Code Online (Sandbox Code Playgroud)

比方说,我想创建每一个新的变量tibbleaaa$ee称为lll,这是可变的每个字符串的第一个字母s在该表中。

我可以得到这些lapply,例如:

lll <- lapply(X = aaa$ee,
       FUN = function(z){substr(z$s, 1,1)})
Run Code Online (Sandbox Code Playgroud)

导致

> lll
[[1]]
[1] "a" "d"

[[2]]
[1] "q" "w"

[[3]]
[1] "e"
Run Code Online (Sandbox Code Playgroud)

但我怎么在这个列表中的每个向量绑定在每列tibbleaaa$ee

产生一个看起来像这样的结果

> aaa$ee
 [[1]]
 # A tibble: 2 x 2
      a s    
  <dbl> <chr> <chr>
1  1.00 as    a
2  2.00 df    d

[[2]]
# A tibble: 2 x 2
      a s    
  <dbl> <chr> <chr>
1  3.00 qz    q
2  6.00 wz    w

[[3]]
# A tibble: 1 x 2
      a s    
  <dbl> <chr> <chr>
1  4.00 ez    e
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

我们可以使用map和循环遍历 'ee' 列mutate以创建 'new' 列

library(purrr)
out <- aaa %>% 
         mutate(ee = map(ee, ~ .x %>% 
                              mutate(new = substr(s, 1, 1))))


out$ee
#[[1]]
## A tibble: 2 x 3
#      a s     new  
#  <dbl> <chr> <chr>
#1     1 as    a    
#2     2 df    d    

#[[2]]
# A tibble: 2 x 3
#      a s     new  
#  <dbl> <chr> <chr>
#1     3 qz    q    
#2     6 wz    w 

#[[3]]
# A tibble: 1 x 3
#      a s     new  
#  <dbl> <chr> <chr>
#1     4 ez    e    
Run Code Online (Sandbox Code Playgroud)

如果我们正在使用lapply方法 (using base R),那么 withtransform创建一个新列并将其分配给 'ee'

aaa$ee <- lapply(aaa$ee, transform, new = substr(s, 1, 1))
Run Code Online (Sandbox Code Playgroud)