我想向数据框的每一行添加一个列表。
# 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)
这是一个非常常见的问题,可能所有tidyverse用户都会在某个时间或其他时间遇到(例如,我不久前发布的这个问题)。基本上,tibble试图对如何处理不同长度的列绑定向量或列表做出巧妙的假设。这些假设与 R 的其余部分进行向量回收的方式一致,但您通常不希望对列表列使用相同的回收逻辑。
解决方案是将您的列表包装在另一个列表中,以便tibble将新值解释为单个元素并重复它,而不是回收列表的元素。
df$my.lists <- list(list("boo", "bah"))
Run Code Online (Sandbox Code Playgroud)
首选方法可能会在下一个版本中更改tibble,请参阅此处了解更多信息。