2017-07-07 52 views
9

我想知道如何操作一個包含存儲在tibble中的data.frames的列表。R:從一個tibble的data.frames列表中提取列

具體而言,我想從data.frame中提取存儲在tibble list列中的兩列。

我想從這個tibbleÇ

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) 

去這個tibble d

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

感謝

伊恩

+0

列'了'和'B'在數據集中'C'因素,但它們在數據集中的字符'D'。這是故意的嗎?如果他們是 – wibeasley

+0

,那不是故意的,他們應該是 – Iain

+0

Cool中的字符。我滑入'stringsAsFactors = F'。 – wibeasley

回答

5

您可以創建一個功能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 
} 
+0

顯示幫助函數是非常有用的,因爲它幫助我瞭解我遇到的問題,即我需要考慮列表列中的空條目。 – Iain

9

c2是最終的輸出。

library(tidyverse) 

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

我喜歡'a'和'b'沒有硬編碼。 – wibeasley

+0

同意 - 非常好的解決方案 – Iain

6

我覺得這個做的伎倆與d請求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

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 tibble到cc所以它不能與c()碰撞。)

+0

不幸的是,我不知道總是知道列的名字 – Iain

相關問題