Преобразование столбца данных в строки с использованием пакета Tidyr и / или Reshape в R - PullRequest
1 голос
/ 16 апреля 2020

Я хотел бы переместить последний столбец (в текущем наборе данных) в строки (в нужном наборе данных) с отсутствующими данными. Я просмотрел пакеты reshape, reshape2 и tidyr. Функция собирать () в пакете tidyr должна быть решением, но я не мог справиться с этим до сих пор. Есть предложения по этому поводу? Заранее спасибо.

Текущий набор данных:

  date       citycode cityname       cases deaths cases_03_04
1 01-04-2020        1 city1            197      3         241
2 01-04-2020        2 city2             26      0          32

Требуемый набор данных:

  date       citycode cityname       cases deaths
1 01-04-2020        1 city1            197      3         
2 01-04-2020        2 city2             26      0          
3 03-04-2020        1 city1            241     na
4 03-04-2020        2 city2             32     na

1 Ответ

0 голосов
/ 16 апреля 2020

A data.table решение.

library(data.table)
dt <- fread('date citycode cityname cases deaths cases_03_04
01-04-2020 1 city1 197 3 241
01-04-2020  2 city2 26 0 32')


wdt <- dcast(dt,...~date,value.var = "cases")

wdt
#>    citycode cityname deaths cases_03_04 01-04-2020
#> 1:        1    city1      3         241        197
#> 2:        2    city2      0          32         26
setnames(wdt,old = "cases_03_04",new = "03-04-2020")

ldt <- melt(wdt,measure.vars = patterns("2020$"),variable.name = "date",value.name = "cases")

ldt[date=="03-04-2020",deaths:=NA][]
#>    citycode cityname deaths       date cases
#> 1:        1    city1     NA 03-04-2020   241
#> 2:        2    city2     NA 03-04-2020    32
#> 3:        1    city1      3 01-04-2020   197
#> 4:        2    city2      0 01-04-2020    26

tidyr решение

library(dplyr)
library(tidyr)
library(data.table)

dt <- fread('date citycode cityname cases deaths cases_03_04
01-04-2020 1 city1 197 3 241
01-04-2020  2 city2 26 0 32')

df <- tibble(dt)

wdf <- pivot_wider(df,names_from = date,values_from =  cases)

names(wdf) <- c("citycode", "cityname", "deaths", "03-04-2020", "01-04-2020")

wdf
#> # A tibble: 2 x 5
#>   citycode cityname deaths `03-04-2020` `01-04-2020`
#>      <int> <chr>     <int>        <int>        <int>
#> 1        1 city1         3          241          197
#> 2        2 city2         0           32           26

ldf <- pivot_longer(wdf,cols =c("03-04-2020", "01-04-2020"),names_to = "date",values_to = "cases")

ldf %>% 
  mutate(deaths=ifelse(date=="03-04-2020",NA,deaths))
#> # A tibble: 4 x 5
#>   citycode cityname deaths date       cases
#>      <int> <chr>     <int> <chr>      <int>
#> 1        1 city1        NA 03-04-2020   241
#> 2        1 city1         3 01-04-2020   197
#> 3        2 city2        NA 03-04-2020    32
#> 4        2 city2         0 01-04-2020    26

Создано в 2020-04-17 пакетом Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...