是否有 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"))

使用 dplyrstringrtidyr 我们可以做到

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))