2017-07-07 29 views
9

Zastanawiam się, jak manipulować listą zawierającą dane.frames przechowywane w tibble.R: Wyodrębnianie kolumn z listy data.frames w kamerze

W szczególności chciałbym wyodrębnić dwie kolumny z data.frame, które są przechowywane w kolumnie listy wątków.

Chciałbym odchodzą od tej tibble 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) 

do tego tibble d

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

dzięki

Iain

+0

kolumny 'A' i' B' czynniki są w zbiorze danych 'C', ale są znaki w zbiorze 'd'. Czy to jest zamierzone? – wibeasley

+0

jeśli są, to nie było zamierzone, powinny być znakami w obu – Iain

+0

Cool. Wrzuciłem w "stringsAsFactors = F". – wibeasley

Odpowiedz

5

Można by utworzyć funkcję f zmieniać się wartości NULL, a następnie zastosować je do kolumny my_data i zakończyć 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 

Gdzie f jest funkcją pomocnik zmienić na wartości NULL i jest zdefiniowany jako

f <- function(x) { 
    if(is.null(x)) data.frame(a = NA, b = NA) else x 
} 
+0

Pokazanie funkcji pomocnika było bardzo przydatne, ponieważ pomogło mi zrozumieć problem, który miałem, a mianowicie, że muszę uwzględnić puste wpisy w kolumnie z mojej listy. – Iain

9

c2 się końcowy wynik.

library(tidyverse) 

c2 <- c %>% 
    filter(!map_lgl(my_data, is.null)) %>% 
    unnest() %>% 
    right_join(c, by = "z") %>% 
    select(-my_data) 
+0

Lubię jak "a" i "b" nie są zakodowane na stałe. – wibeasley

+0

uzgodnione - bardzo ładne rozwiązanie – Iain

6

myślę, że to załatwia sprawę z d żądany tibble:

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 
5

Czy znasz swoje nazwy kolumn z wyprzedzeniem?

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) 

(I zmieniono nazwę c tibble do cc więc nie może kolidować z c().)

+0

Niestety, nie wiem zawsze znać nazwę kolumny – Iain