是否有 tidyr 的 unnest() 函数的基础 R 版本?
Is there a base R version of tidyr's unnest() function?
我一直在使用 tidyverse
,现在我对 base R 的可能性很感兴趣。
让我们来看看这个简单的data.frame
df <- data.frame(id = 1:4, nested = c("a, b, f", "c, d", "e", "e, f"))
使用 dplyr
、stringr
和 tidyr
我们可以做到
df %>%
mutate(nested = str_split(nested, ", ")) %>%
unnest(nested)
得到(让我们忽略tibble
部分)
# A tibble: 8 x 2
id nested
<int> <chr>
1 1 a
2 1 b
3 1 f
4 2 c
5 2 d
6 3 e
7 4 e
8 4 f
现在我们想使用基础 R 工具重建这个。所以
transform(df, nested = strsplit(nested, ", "))
给出了 mutate
部分的使用,但是我们如何 unnest()
这个 data.frame?我虽然想使用 unlist()
但找不到令人满意的方法。
我们可以在 named
list
上使用 stack
一行
with(df, setNames(stack(setNames(strsplit(nested, ","), id))[2:1], names(df)))
-输出
id nested
1 1 a
2 1 b
3 1 f
4 2 c
5 2 d
6 3 e
7 4 e
8 4 f
如果我们使用transform
,则使用rep
根据list
列的lengths
进行复制
out <- transform(df, nested = strsplit(nested, ", "))
data.frame(id = rep(out$id, lengths(out$nested)), nested = unlist(out$nested))
我一直在使用 tidyverse
,现在我对 base R 的可能性很感兴趣。
让我们来看看这个简单的data.frame
df <- data.frame(id = 1:4, nested = c("a, b, f", "c, d", "e", "e, f"))
使用 dplyr
、stringr
和 tidyr
我们可以做到
df %>%
mutate(nested = str_split(nested, ", ")) %>%
unnest(nested)
得到(让我们忽略tibble
部分)
# A tibble: 8 x 2
id nested
<int> <chr>
1 1 a
2 1 b
3 1 f
4 2 c
5 2 d
6 3 e
7 4 e
8 4 f
现在我们想使用基础 R 工具重建这个。所以
transform(df, nested = strsplit(nested, ", "))
给出了 mutate
部分的使用,但是我们如何 unnest()
这个 data.frame?我虽然想使用 unlist()
但找不到令人满意的方法。
我们可以在 named
list
上使用 stack
一行
with(df, setNames(stack(setNames(strsplit(nested, ","), id))[2:1], names(df)))
-输出
id nested
1 1 a
2 1 b
3 1 f
4 2 c
5 2 d
6 3 e
7 4 e
8 4 f
如果我们使用transform
,则使用rep
根据list
列的lengths
进行复制
out <- transform(df, nested = strsplit(nested, ", "))
data.frame(id = rep(out$id, lengths(out$nested)), nested = unlist(out$nested))