Modify/Add 列到嵌套小标题

Modify/Add column to nested tibble

我有一个带有 variables/columns 的小标题,其中包含不同形状的小标题列表。我想为其中一个变量中的每个(子)tibble 添加一个 variable/column。

例如这样的数据

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")))

看起来像:

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

> 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   

假设我想在aaa$ee中的每个tibble中创建一个名为lll的新变量,它是变量s中每个字符串的第一个字母table.

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

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

导致

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

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

[[3]]
[1] "e"

但是如何将此列表中的每个向量绑定为 aaa$ee 中每个 tibble 中的一列?

要生成类似于

的结果
> 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

我们可以使用 mapmutate 遍历 'ee' 列来创建 '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    

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

aaa$ee <- lapply(aaa$ee, transform, new = substr(s, 1, 1))