代码之家  ›  专栏  ›  技术社区  ›  Martin Gal

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

  •  1
  • Martin Gal  · 技术社区  · 5 年前

    我一直在用 tidyverse 很多,现在我对base R的可能性很感兴趣。

    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    
    

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

    transform(df, nested = strsplit(nested, ", "))
    

    mutate unnest() 这个数据框?我想用 unlist() 但找不到令人满意的方法。

    1 回复  |  直到 5 年前
        1
  •  1
  •   akrun    5 年前

    我们可以用 stack 在 named list

    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 基于 lengths 的 柱

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