代码之家  ›  专栏  ›  技术社区  ›  Alex

每隔一行展开一行,然后合并以在dplyr中追加行名

  •  2
  • Alex  · 技术社区  · 8 年前

    我正在尝试制作杂乱无章的数据。我有以下格式的数据:

    name    x
    a       NA
    value   1 
    b       NA
    value   2
    c       NA
    value   3
    

    我希望它是以下格式

    name      x
    a_value   1 
    b_value   2
    c_value   3
    

    如何在dplyr中执行此操作?

    我的第一个想法是想办法 spread 因此

    name    name2        x    x2
    a       value       NA     1
    b       value       NA     2
    c       value       NA     3
    

    从那里我知道我可以使用 unite 对于 name name2 和删除列 x ,但我不确定 传播 可以产生上述效果。

    2 回复  |  直到 8 年前
        1
  •  4
  •   Sotos    8 年前

    您可以在NA上分组并总结,即。

    library(dplyr)
    
    df %>% 
     group_by(grp = cumsum(is.na(x))) %>% 
     summarise(name = paste(name, collapse = '_'))
    

    因此,

    # A tibble: 3 x 2
          grp name   
        <int> <chr>  
    1     1 a_value
    2     2 b_value
    3     3 c_value
    

    数据

    dput(df)
    structure(list(name = c("a", "value", "b", "value", "c", "value"
    ), x = c(NA, 1L, NA, 2L, NA, 3L)), .Names = c("name", "x"), row.names = c(NA, 
    -6L), class = "data.frame")
    
        2
  •  2
  •   G. Grothendieck    8 年前

    使用 na.locf 然后删除不需要的行:

    library(dplyr)
    library(zoo)
    
    DF %>% 
       mutate(x = na.locf(x, fromLast = TRUE)) %>% 
       filter(name != "value")
    

    给:

      name x
    1    a 1
    2    b 2
    3    c 3
    

    笔记

    DF <- 
    structure(list(name = structure(c(1L, 4L, 2L, 4L, 3L, 4L), .Label = c("a", 
    "b", "c", "value"), class = "factor"), x = c(NA, 1L, NA, 2L, 
    NA, 3L)), .Names = c("name", "x"), class = "data.frame", row.names = c(NA, 
    -6L))
    
    推荐文章