我想在数据框的每一行中添加一个列表。
# 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]>
答案 0 :(得分:4)
这是一个非常常见的问题,可能所有tidyverse
用户在某个时间或其他时间都遇到了该问题(例如,我前一段时间发布的this question)。基本上,tibble
试图就如何处理具有不同长度的列绑定向量或列表做出明智的假设。这些假设与R的其余部分如何进行矢量循环一致,但是您通常不希望对列表列使用相同的循环逻辑。
解决方案是将您的列表包装在另一个列表中,这样tibble
会将新值解释为单个元素并将其重复,而不是回收列表的 elements 。 / p>
df$my.lists <- list(list("boo", "bah"))
首选方法可能在下一版tibble
中有所变化,有关更多信息,请参见here。