2017-10-13 73 views
1

說我有一個tibble像這樣:UNNEST向量數據幀,但添加列表索引列

tibble(x=22:23, y=list(4:6,4:7)) 

# A tibble: 2 × 2 
     x   y 
    <int> <list> 
1 22 <int [3]> 
2 23 <int [4]> 

我想通過(與unnest如)unnesting名單將它轉換成一個新的更大tibble,這會給我一個7行的蹣跚。然而,我想添加一個新的列,告訴我,在連接之後的連續給定的y值中,當列表形式時,y值的索引是什麼。下面是上述會是什麼樣這樣做後:

# A tibble: 7 × 2 
     x  y index 
    <int> <int> <int> 
1 22  4  1 
2 22  5  2 
3 22  6  3 
4 23  4  1 
5 23  5  2 
6 23  6  3 
7 23  7  4 

回答

4

您可以mapy柱和unnesting之前每個元素的索引綁定:

df %>% 
    mutate(y = map(y, ~ data.frame(y=.x, index=seq_along(.x)))) %>% 
    unnest() 

# A tibble: 7 x 3 
#  x  y index 
# <int> <int> <int> 
#1 22  4  1 
#2 22  5  2 
#3 22  6  3 
#4 23  4  1 
#5 23  5  2 
#6 23  6  3 
#7 23  7  4 
2

通過起訴unnestgroup_by

library(tidyr) 
library(dplyr) 
df %>% 
    unnest(y)%>%group_by(x)%>%mutate(index=row_number()) 

# A tibble: 7 x 3 
# Groups: x [2] 
     x  y index 
    <int> <int> <int> 
1 22  4  1 
2 22  5  2 
3 22  6  3 
4 23  4  1 
5 23  5  2 
6 23  6  3 
7 23  7  4 
-1

您也可以嘗試rowwisedo

library(tidyverse) 
tibble(x=22:23, y=list(4:6,4:7)) %>% 
    rowwise() %>% 
    do(tibble(x=.$x, y=unlist(.$y), index=1:length(.$y))) 
3

這裏是另一個版本lengths

df %>% 
    mutate(index = lengths(y)) %>% 
    unnest(y) %>% 
    mutate(index = sequence(unique(index))) 
# A tibble: 7 x 3 
#  x index  y 
# <int> <int> <int> 
#1 22  1  4 
#2 22  2  5 
#3 22  3  6 
#4 23  1  4 
#5 23  2  5 
#6 23  3  6 
#7 23  4  7