R: извлечь столбцы из списка данных. Фреймы в тиббле

Мне интересно, как управлять списком, содержащим data.frames, хранящиеся в тибле.

В частности, я хотел бы извлечь два столбца из data.frame, которые хранятся в столбце списка тиббл.

Я хотел бы отойти от этого тибла c

random_data<-list(a=letters[1:10],b=LETTERS[1:10])
x<-as.data.frame(random_data, stringsAsFactors=FALSE)
y<-list()
y[[1]]<-x[1,,drop=FALSE]
y[[3]]<-x[2,,drop=FALSE]
c<-tibble(z=c(1,2,3),my_data=y)

к этой тибле д

d<-tibble(z=c(1,2,3),a=c('a',NA,'b'),b=c('A',NA,'B'))

Благодарность

Иэн


person Iain    schedule 07.07.2017    source источник
comment
Столбцы a и b являются факторами в наборе данных c, но они являются символами в наборе данных d. Это намеренно?   -  person wibeasley    schedule 07.07.2017
comment
если да, то это не было намеренно, они должны быть персонажами в обоих   -  person Iain    schedule 07.07.2017
comment
Прохладный. Я проскользнул stringsAsFactors=F.   -  person wibeasley    schedule 07.07.2017


Ответы (4)


Вы можете создать функцию f для изменения значений NULL, затем применить ее к столбцу my_data и закончить с помощью unnest.

library(dplyr); library(tidyr)

unnest(mutate(c, my_data = lapply(my_data, f)))
# # A tibble: 3 x 3
#       z     a     b
#   <dbl> <chr> <chr>
# 1     1     a     A
# 2     2  <NA>  <NA>
# 3     3     b     B

Где f - вспомогательная функция для изменения значений NULL и определяется как

f <- function(x) {
    if(is.null(x)) data.frame(a = NA, b = NA) else x
}
person Rich Scriven    schedule 07.07.2017
comment
Показ вспомогательной функции был очень полезен, поскольку помог мне понять проблему, с которой я столкнулся, а именно то, что мне нужно учитывать пустые записи в моем столбце списка. - person Iain; 08.07.2017

c2 - это окончательный результат.

library(tidyverse)

c2 <- c %>%
  filter(!map_lgl(my_data, is.null)) %>%
  unnest() %>%
  right_join(c, by = "z") %>%
  select(-my_data)
person www    schedule 07.07.2017
comment
согласился - очень красивое решение - person Iain; 08.07.2017

Я думаю, что это помогает d запрошенный тиббл:

library(dplyr)

new.y <- lapply(y, function(x) if(is.null(x)) data.frame(a = NA, b = NA) else x)
d <- cbind(z = c(1, 2, 3), bind_rows(new.y)) %>% tbl_df()


# # A tibble: 3 x 3
#     z      a      b
#  <dbl> <fctr> <fctr>
# 1   1      a      A
# 2   2     NA     NA
# 3   3      b      B
person Constantinos    schedule 07.07.2017

Вы заранее знаете названия столбцов?

extract_column <- function( d, column_name ) {
  if( is.null(d) ) {
    NA_character_
  } else {
    as.character(d[[column_name]])
  }  
}


cc %>% 
  dplyr::mutate(
    a = purrr::map_chr(.$my_data, extract_column, column_name="a"),
    b = purrr::map_chr(.$my_data, extract_column, column_name="b")
  ) %>% 
  dplyr::select(-my_data)

(Я переименовал ваш c тиббл в cc, чтобы он не мог столкнуться с c().)

person wibeasley    schedule 07.07.2017
comment
к сожалению, я не всегда знаю названия столбцов - person Iain; 08.07.2017