【问题标题】:pivot_longer in R and specify column type of name column to be dateR中的pivot_longer并将名称列的列类型指定为日期
【发布时间】:2020-05-02 19:45:06
【问题描述】:

我正在尝试分析一些冠状病毒数据以查看每天的病例等。我在 CDC 网站上找到了数据,格式不整齐,每个日期都有自己的列。我正在使用 pivot_longer 转置数据。下面的工作是读入数据,对其进行透视,并使用 mutate 将日期的列数据类型更改为日期。

library(tidyverse)
library(lubridate)
deaths = read_csv("https://usafactsstatic.blob.core.windows.net/public/data/covid-19/covid_deaths_usafacts.csv")

deaths2 = deaths %>%
  rename(county = `County Name`, state = State) %>%
  pivot_longer(-c(countyFIPS, county, state, stateFIPS), names_to = "date", values_to = "deaths_cumulative") %>%
  mutate(date = mdy(date)) %>%
  select(state, county, date, deaths_cumulative)

但是,我正在尝试使用 pivot_longer 的 names_ptypes 参数来指定该步骤中的数据类型。如果我执行以下操作,日期列确实以日期数据类型结束,但列中的所有值都是 NA。我不确定发生了什么事。也许它需要一种格式,但据我所知,日期不允许。有没有办法做到这一点?

deaths2 = deaths %>%
  rename(county = `County Name`, state = State) %>%
  pivot_longer(-c(countyFIPS, county, state, stateFIPS), names_to = "date", values_to = "deaths_cumulative", names_ptypes = list(date = Date())) %>%
  select(state, county, date, deaths_cumulative)

【问题讨论】:

  • 找不到函数Date,是来自readr还是lubridate
  • @akrun 老实说,我不确定。我在网上找到的帮助和示例说你可以使用像 integer() 或 numeric() 这样的类型,所以我尝试了 date(),但没有奏效(它将值保留为字符),然后我尝试了 Date() 和它将列更改为日期格式,但导致 NA。因此,解决方案可能涉及 Date 或其他内容,也可能是不可能的。
  • Date 是我找不到的一个函数。可能与您的软件包版本有关。我不确定。

标签: r tidyverse tidyr


【解决方案1】:

我想这就是你要找的东西:

library(tidyverse)
deaths2 <- deaths %>% 
  as_tibble() %>% 
  gather(Xdate, deaths, -countyFIPS, - County.Name, - State, - stateFIPS) %>% 
  mutate(DATE = lubridate::as_date(lubridate::mdy(str_sub(Xdate,2)))) %>% 
  select(- Xdate)

mdy 重新格式化日期字符串,以便as_date 可以强制它。

【讨论】:

  • 我很高兴花时间回答,但我的问题具体是如何在 pivot_longer 中做到这一点,而不必事后使用 mutate 和 mdy。如果它是一个整数列,pivot_longer 可以做到这一点。但是,我不确定它是否可以使用日期。
猜你喜欢
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多