tidyr 的 unnest() 函数是否有基本 R 版本?

Mar*_*Gal 5 r unnest tidyr

我已经使用了tidyverse很多,现在我对 Base R 的可能性很感兴趣。

让我们看一下这个简单的 data.frame

df <- data.frame(id = 1:4, nested = c("a, b, f", "c, d", "e", "e, f"))
Run Code Online (Sandbox Code Playgroud)

使用dplyr,stringr我们tidyr可以做

df %>% 
  mutate(nested = str_split(nested, ", ")) %>% 
  unnest(nested)
Run Code Online (Sandbox Code Playgroud)

得到(让我们忽略这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    
Run Code Online (Sandbox Code Playgroud)

现在我们想使用基础 R 工具重建这个。所以

transform(df, nested = strsplit(nested, ", "))
Run Code Online (Sandbox Code Playgroud)

给出了使用mutate-part,但是我们如何使用unnest()这个data.frame?我想过使用unlist()但找不到令人满意的方法。

akr*_*run 1

stack我们可以在named list一行中使用

with(df, setNames(stack(setNames(strsplit(nested, ","), id))[2:1], names(df)))
Run Code Online (Sandbox Code Playgroud)

-输出

   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
Run Code Online (Sandbox Code Playgroud)

如果我们使用transform,则使用rep基于lengths列的list复制

out <- transform(df, nested = strsplit(nested, ", "))
data.frame(id = rep(out$id, lengths(out$nested)), nested = unlist(out$nested))
Run Code Online (Sandbox Code Playgroud)