数据框中的未嵌套向量但添加列表索引列
Unnest vector in dataframe but add list indices column
说我有一个 tibble
这样的:
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
)将其转换为更大的新 tibble
,这将给我一个 7 行的小标题。但是,我想添加一个新列,告诉我,对于取消嵌套后的一行中给定的 y-value,该 y-value 的索引在列表形式时是什么。执行此操作后,上面的内容如下所示:
# 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
通过起诉 unnest
和 group_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
您可以 map
在 y
列上并在取消嵌套之前为每个元素绑定索引:
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
您也可以尝试 rowwise
和 do
。
library(tidyverse)
tibble(x=22:23, y=list(4:6,4:7)) %>%
rowwise() %>%
do(tibble(x=.$x, y=unlist(.$y), index=1:length(.$y)))
这是另一个版本 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
说我有一个 tibble
这样的:
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
)将其转换为更大的新 tibble
,这将给我一个 7 行的小标题。但是,我想添加一个新列,告诉我,对于取消嵌套后的一行中给定的 y-value,该 y-value 的索引在列表形式时是什么。执行此操作后,上面的内容如下所示:
# 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
通过起诉 unnest
和 group_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
您可以 map
在 y
列上并在取消嵌套之前为每个元素绑定索引:
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
您也可以尝试 rowwise
和 do
。
library(tidyverse)
tibble(x=22:23, y=list(4:6,4:7)) %>%
rowwise() %>%
do(tibble(x=.$x, y=unlist(.$y), index=1:length(.$y)))
这是另一个版本 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