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

重新格式化数据帧具有唯一的日期行

  •  0
  • nak5120  · 技术社区  · 6 年前

    我下面有一个数据框架:

    dat
    
    Day           Col1   Another    Value    High/Low
    2018-01-01       A         B       20        High 
    2018-01-01       B         G       30        High 
    2018-01-02       C         D       40         Low
    2018-01-02       C         M       70         Low
    2018-01-02       C         G       50         Low
    

    如何重新格式化,使其看起来像这样:

    我想把原因也按降序排列,如果它是高的,就按升序排列。同样,每个日期也不会有多个高/低。

    Day             Reason_1   Value_1    Reason_2    Value_2   Reason_3   Value_3  
    2018-01-01           B-G        30         A-B         20         NA       NA
    2018-01-02           C-D        40         C-G         50        C-M       70
    

    我尝试使用spread函数,但这使col1和其他值成为列:

    library(tidyr)
    new_df<- spread(dat, Col1_Another_Combined, Value)
    

    不过,这没什么好运气

    1 回复  |  直到 6 年前
        1
  •  2
  •   bouncyball    6 年前

    我们可以使用来自 tidyverse :

    首先,我们按天分组,然后计算 Value .我们使用 row_number ,因为它将导致跨行的唯一排序。我们使用 unite 创建 reason 列,然后使用 gather , 团结 spread 做最后宽到长到宽的转换。需要注意的一点是 value_* 列仍然被编码为字符值,这很容易更改。

    dat %>%
        group_by(Day) %>%
        mutate(row_num_value = row_number(Value)) %>% # ranking
        unite(reason, Col1, Another, sep = " - ") %>% # reason column
        gather(variable, value, reason, Value) %>% # convert to long
        unite(variable2, variable, row_num_value, sep = '_') %>% 
        spread(variable2, value) # convert to wide
    
    # A tibble: 2 x 8
    # Groups:   Day [2]
      Day        High.Low reason_1 reason_2 reason_3 Value_1 Value_2 Value_3
      <chr>      <chr>    <chr>    <chr>    <chr>    <chr>   <chr>   <chr>  
    1 2018-01-01 High     A - B    B - G    NA       20      30      NA     
    2 2018-01-02 Low      C - D    C - G    C - M    40      50      70