Расположить несколько столбцов по ключу / значению и объединить их - PullRequest
1 голос
/ 17 марта 2020

У меня есть следующий фрейм данных:

date <- c(1,2,3,4,5,6,7)
value1 <-c(10,20,30,0,0,0,0)
key1 <- c(100,200,300,0,0,0,0)
value2 <- c(0,0,0,0,40,30,20)
key2 <- c(0,0,0,0,400,500,600)
df <- data.frame(date,value1,key1,value2,key2)

Это выглядит так:

date value1 key1 value2 key2
1    10     100  0      0
2    20     200  0      0
3    30     300  0      0
4    0      0    0      0   
5    0      0    40     400   
6    0      0    30     500    
7    0      0    20     600   

Я хочу преобразовать его так:

date 100    200  300  400  500  600
1    10     0    0    0    0    0
2    0      20   0    0    0    0
3    10     0    30   0    0    0
4    10     0    0    0    0    0   
5    10     0    0    40   0    0   
6    10     0    0    0    30   0    
7    10     0    0    0    0    20

I Я могу переставить их вручную следующим образом:

library(tidyr)
numbers_transpose <- df %>% spread(key = key1, value = value1)
numbers_transpose <- numbers_transpose %>% spread(key = key2, value = value2)

Но у меня есть 50 пар, и я хотел бы их автоматизировать. Как это сделать простым способом?

1 Ответ

2 голосов
/ 17 марта 2020

Мы можем преобразовать в «длинный» формат с помощью pivot_longer, а затем изменить его обратно

library(dplyr)
library(tidyr)
df %>%
    pivot_longer(cols = -date, names_to = c('.value', 'grp'), 
             names_sep= "(?<=[a-z])(?=[0-9])", values_drop_na = TRUE) %>%
    filter(key != 0) %>%
    pivot_wider(names_from = key, values_from = value,
           values_fill = list(value = 0)) %>%
    select(-grp)
# A tibble: 6 x 7
#   date `100` `200` `300` `400` `500` `600`
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1     1    10     0     0     0     0     0
#2     2     0    20     0     0     0     0
#3     3     0     0    30     0     0     0
#4     5     0     0     0    40     0     0
#5     6     0     0     0     0    30     0
#6     7     0     0     0     0     0    20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...