Изменить / добавить столбец к вложенному столбцу - PullRequest
0 голосов
/ 02 мая 2018

У меня есть столбик с переменными / столбцами, которые включают списки элементов разной формы. Я хотел бы добавить переменную / столбец к каждому (под) столбцу в одной из переменных.

например. такие данные

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   

Допустим, я хочу создать новую переменную в каждой tibble в aaa$ee с именем lll, которая является первой буквой каждой строки в переменной s в этой таблице.

Я могу получить их с помощью 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"

Но как мне связать каждый вектор в этом списке как столбец в каждом tibble в aaa$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

1 Ответ

0 голосов
/ 02 мая 2018

Мы можем перебрать столбец 'ee' с помощью map и mutate, чтобы создать «новый» столбец

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