将列表添加到数据框的每一行

时间:2018-08-30 21:18:11

标签: r dplyr

我想在数据框的每一行中添加一个列表。

# DATA
> df <- tibble(ID = 1:6, x = letters[1:6])

# A tibble: 6 x 2
     ID x    
  <int> <chr>
1     1 a    
2     2 b    
3     3 c    
4     4 d    
5     5 e    
6     6 f    

添加单个值很容易。

df$new.col <- "boo"

# A tibble: 6 x 3
     ID x     new.col
  <int> <chr> <chr>  
1     1 a     boo    
2     2 b     boo    
3     3 c     boo    
4     4 d     boo    
5     5 e     boo    
6     6 f     boo    

添加多个值并不容易。

不是将列表添加到每一行(如上所述),而是将列表的内容应用于整个列。这不是很直观:

df$my.lists <- list("boo", "bah")
df %>% unnest()
# A tibble: 6 x 3
     ID x     my.lists
  <int> <chr> <chr>   
1     1 a     boo     
2     2 b     bah     
3     3 c     boo     
4     4 d     bah     
5     5 e     boo     
6     6 f     bah   

...而且都不是...

df$my.lists <- c("boo", "bah")
df %>% unnest()
# A tibble: 6 x 3
     ID x     my.lists
  <int> <chr> <chr>   
1     1 a     boo     
2     2 b     bah     
3     3 c     boo     
4     4 d     bah     
5     5 e     boo     
6     6 f     bah  

我想要的结果将在每一行中都有一个列表,如下所示:

# A tibble: 6 x 3
     ID x     my.lists
  <int> <chr> <chr>   
1     1 a     <list [2]>    
2     2 b     <list [2]>
3     3 c     <list [2]>
4     4 d     <list [2]>
5     5 e     <list [2]>
6     6 f     <list [2]>

1 个答案:

答案 0 :(得分:4)

这是一个非常常见的问题,可能所有tidyverse用户在某个时间或其他时间都遇到了该问题(例如,我前一段时间发布的this question)。基本上,tibble试图就如何处理具有不同长度的列绑定向量或列表做出明智的假设。这些假设与R的其余部分如何进行矢量循环一致,但是您通常希望对列表列使用相同的循环逻辑。

解决方案是将您的列表包装在另一个列表中,这样tibble会将新值解释为单个元素并将其重复,而不是回收列表的 elements 。 / p>

df$my.lists <- list(list("boo", "bah"))

首选方法可能在下一版tibble中有所变化,有关更多信息,请参见here