重新格式化数据框具有唯一的日期行
Reformat Dataframe have Unique Date Rows
我在下面有一个数据框:
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
如何重新格式化它,使其看起来像这样:
我也想对原因进行排序,如果高则按降序排列,如果低则按升序排列。此外,每个日期永远不会有多个 high/lows.
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
我尝试使用展开函数,但这使得 Col1 和另一个值作为列:
library(tidyr)
new_df<- spread(dat, Col1_Another_Combined, Value)
虽然运气不好
我们可以使用 tidyverse
中的各种动词:
首先,我们按天分组,然后计算出一个排名Value
。我们使用 row_number
,因为它会导致跨行的唯一排名。我们使用unite
创建reason
列,然后使用gather
、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
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
如何重新格式化它,使其看起来像这样:
我也想对原因进行排序,如果高则按降序排列,如果低则按升序排列。此外,每个日期永远不会有多个 high/lows.
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
我尝试使用展开函数,但这使得 Col1 和另一个值作为列:
library(tidyr)
new_df<- spread(dat, Col1_Another_Combined, Value)
虽然运气不好
我们可以使用 tidyverse
中的各种动词:
首先,我们按天分组,然后计算出一个排名Value
。我们使用 row_number
,因为它会导致跨行的唯一排名。我们使用unite
创建reason
列,然后使用gather
、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