2016-10-18 69 views
2

我想根據列表名稱(包含不同的id值)將數據框與列標識列表和列表合併。作爲一個例子:將數據框和列表連接到包含列表數據框的列表中

g <- data.frame(id = c("a1", "b2"), k = c(4, 5)) 
h <- list(a1 = list(
    p = c(1, 2, 3), 
    l = c("A", "B", "C"), 
    data = mtcars 
), 
b2 = list(
    p = c(5, 6, 7), 
    l = c("M", "N", "O"), 
    data = iris 
)) 

我怎樣才能然後合併g和h(基於克$ ID和h的名稱)到含有除了H作爲列表列ID和k列一個數據幀G2:

# A tibble: 2 × 3 
    id     h  k 
    <fctr>    <list> <dbl> 
1  a1  <tibble [3*1]>  4 
2  b2  <tibble [3*1]>  5 

通過@StevenBeaupré的答案是superuseful。我把Liberty的自由轉換成了一個函數,以防其他人需要它。

library(tidyverse) 
cnv_list_tibble <- function(ls) { 
    as_tibble(ls) %>% 
    gather(id, data) %>% 
    nest(.,-id) 
} 

瞧,你有一個列表列,可以用於後續的合併/加入。

+4

什麼是理想的輸出? –

回答

2

你可以嘗試:

library(tidyr) 
library(dplyr) 
library(tibble) 

as_tibble(h) %>% 
    gather(id, data) %>% 
    group_by(id) %>% 
    do(h = as_tibble(.[-1])) %>% 
    left_join(., g) 

其中給出:

#Joining, by = "id" 
#Source: local data frame [2 x 3] 
#Groups: <by row> 
# 
## A tibble: 2 × 3 
#  id    h  k 
# <chr>   <list> <dbl> 
#1 a1 <tibble [3 × 1]>  4 
#2 b2 <tibble [3 × 1]>  5 

或者使用purrr

library(purrr) 

as_tibble(h) %>% 
    gather(id, data) %>% 
    slice_rows("id") %>% 
    by_slice(~as_tibble(.), .to = "h") %>% 
    left_join(., g) 
+0

do-version在dplyr 0.5.0中引發以下錯誤:加入,by = c(「id」,「h」) 錯誤:由於不兼容的類型,無法加入'h'x'h'/list) – Misha

+1

@Misha我正在使用'dplyr_0.5.0.9000',它工作正常。我很困惑,爲什麼它說'join by = c(「id」,「h」)'......'g'中沒有「h」列。 –

+1

我升級到0.5.0.9000 - 現在它可以工作。我不知道g中的「h」欄。謝謝。 – Misha