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

形成一个数据帧,该数据帧包含R中包含类别和子类别的列

  •  1
  • opposity  · 技术社区  · 2 年前

    category   value
    
    A           NA
    high        20
    mid         18
    low         10
    B           NA
    high        22
    mid         12
    low         11
    C           NA
    low         14
    

    如您所见,有3个类别A、B和可能的子类别高、中、低。类别名称具有NA值,因为只有每个类别的子类别具有值,而不是类别本身。使这一点变得复杂的是,C类只有一个子类别,这是低的。我想将其转换为的格式如下:

    category   subcategory   value
    
    A              high       20
    A              mid        18
    A              low        10
    B              high       22
    B              mid        12
    B              low        11
    C              low        14
    

    如果有人能帮我,我将不胜感激。我已经想了很久了。谢谢

    1 回复  |  直到 2 年前
        1
  •  2
  •   Ronak Shah    2 年前

    您可以定义子类别值( cat_value subcategory ). 将子类别值更改为 NA 和使用 tidyr::fill category

    library(dplyr)
    
    cat_value <- c('high', 'mid', 'low')
    
    df %>%
      mutate(subcategory = replace(category, !category %in% cat_value, NA) ,
             category = replace(category, category %in% cat_value, NA)) %>%
      tidyr::fill(category) %>%
      filter(!is.na(subcategory)) %>%
      select(category, subcategory, value)
    
    #  category subcategory value
    #1        A        high    20
    #2        A         mid    18
    #3        A         low    10
    #4        B        high    22
    #5        B         mid    12
    #6        B         low    11
    #7        C         low    14
    

    数据

    df <- structure(list(category = c("A", "high", "mid", "low", "B", "high", 
    "mid", "low", "C", "low"), value = c(NA, 20L, 18L, 10L, NA, 22L, 
    12L, 11L, NA, 14L)), class = "data.frame", row.names = c(NA, -10L))