Как перенести аналогичные значения записи в отдельные столбцы в R с помощью (reshape2 или et c)? - PullRequest
0 голосов
/ 16 июня 2020

Итак, я хотел бы преобразовать следующее:

days <- c("MONDAY", "SUNDAY", "MONDAY", "SUNDAY", "MONDAY", "SUNDAY")
dates <- c("2020-03-02", "2020-03-08", "2020-03-09", "2020-03-15", "2020-03-16", "2020-03-22")

df <- cbind(days, dates)


+--------+------------+
|  days  |   dates    |
+--------+------------+
| MONDAY | 2020.03.02 |
| SUNDAY | 2020.03.08 |
| MONDAY | 2020.03.09 |
| SUNDAY | 2020.03.15 |
| MONDAY | 2020.03.16 |
| SUNDAY | 2020.03.22 |
+--------+------------+

В это:

+------------+------------+
|   MONDAY   |   SUNDAY   |
+------------+------------+
| 2020.03.02 | 2020.03.08 |
| 2020.03.09 | 2020.03.15 |
| 2020.03.16 | 2020.03.22 |
+------------+------------+

У вас есть какие-нибудь подсказки, как мне это сделать? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 26 июня 2020

Вот решение в tidyr, которое учитывает острый комментарий JohannesNE.

Вы можете думать об этом как об «уловке», на которую вы ссылались в своем ответе (при условии, что каждый следующий Monday и Sunday - пара):

df <- as.data.frame(df) # tidyr needs a df object
df <- cbind(pair = rep(1:3, each = 2), df) # the 'trick'!
  pair   days      dates
1    1 MONDAY 2020-03-02
2    1 SUNDAY 2020-03-08
3    2 MONDAY 2020-03-09
4    2 SUNDAY 2020-03-15
5    3 MONDAY 2020-03-16
6    3 SUNDAY 2020-03-22

Теперь реализация tidyr:

library(tidyr)

df %>% pivot_wider(names_from = days, values_from = dates)
# A tibble: 3 x 3
   pair MONDAY     SUNDAY    
  <int> <chr>      <chr>     
1     1 2020-03-02 2020-03-08
2     2 2020-03-09 2020-03-15
3     3 2020-03-16 2020-03-22
0 голосов
/ 16 июня 2020

В Base-R

sapply(split(df,df$days), function(x) x$dates)

     MONDAY       SUNDAY      
[1,] "2020-03-02" "2020-03-08"
[2,] "2020-03-09" "2020-03-15"
[3,] "2020-03-16" "2020-03-22"
...