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

R 重新格式化数据帧具有唯一的日期行,r,dplyr,reshape,R,Dplyr,Reshape,我在下面有一个数据框: 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

我在下面有一个数据框:

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)
library(tidyr)

新的_df我们可以使用来自
tidyverse
的各种动词:

首先,我们按天分组,然后计算
值的排名。我们使用
行数
,因为它将导致跨行的唯一排名。我们使用
unite
创建
reason
列,然后使用
collect
unite
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 
dat%>%
分组单位(天)%>%
变异(行数值=行数(值))%>%排名
unite(原因,Col1,另一个,sep=“-”/>%#原因列
聚集(变量、值、原因、值)%>%#转换为长
unite(variable2,variable,row_num_value,sep=''.''''%>%
排列(可变2,值)#转换为宽
#一个tibble:2x8
#分组:第[2]天
日高。日低原因\u 1原因\u 2原因\u 3值\u 1值\u 2值\u 3
1 2018-01-01高A-B-G NA 20 30 NA
2 2018-01-02低碳-D碳-G碳-M 40 50 70

我们可以使用
tidyverse
中的各种动词:

首先,我们按天分组,然后计算
值的排名。我们使用
行数
,因为它将导致跨行的唯一排名。我们使用
unite
创建
reason
列,然后使用
collect
unite
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 
dat%>%
分组单位(天)%>%
变异(行数值=行数(值))%>%排名
unite(原因,Col1,另一个,sep=“-”/>%#原因列
聚集(变量、值、原因、值)%>%#转换为长
unite(variable2,variable,row_num_value,sep=''.''''%>%
排列(可变2,值)#转换为宽
#一个tibble:2x8
#分组:第[2]天
日高。日低原因\u 1原因\u 2原因\u 3值\u 1值\u 2值\u 3
1 2018-01-01高A-B-G NA 20 30 NA
2 2018-01-02低碳-D碳-G碳-M 40 50 70

您尝试了什么?编辑以显示我迄今为止的尝试。我所知道的只是spread函数,但它使值成为列。您尝试了什么?编辑以显示我迄今为止尝试的内容。我所知道的只是spread函数,但它使值成为列