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

Net*_*tle 1 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    
Run Code Online (Sandbox Code Playgroud)

添加单个值很容易。

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    
Run Code Online (Sandbox Code Playgroud)

添加多个值并不简单。

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

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   
Run Code Online (Sandbox Code Playgroud)

......也没有......

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  
Run Code Online (Sandbox Code Playgroud)

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

# 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]>
Run Code Online (Sandbox Code Playgroud)

mik*_*eck 7

这是一个非常常见的问题,可能所有tidyverse用户都会在某个时间或其他时间遇到(例如,我不久前发布的这个问题)。基本上,tibble试图对如何处理不同长度的列绑定向量或列表做出巧妙的假设。这些假设与 R 的其余部分进行向量回收的方式一致,但您通常希望对列表列使用相同的回收逻辑。

解决方案是将您的列表包装在另一个列表中,以便tibble将新值解释为单个元素并重复它,而不是回收列表的元素

df$my.lists <- list(list("boo", "bah"))
Run Code Online (Sandbox Code Playgroud)

首选方法可能会在下一个版本中更改tibble,请参阅此处了解更多信息。