将带有日期的列转换为 R 中的行
Converting columns with date to rows in R
假设我们在 R 中有这样一个 data.frame:
d = data.frame('2019q1' = 1, '2019q2' =2, '2019q3' = 3)
看起来像这样:
X2019q1 X2019q2 X2019q3
1 1 2 3
如何将其转换为如下所示:
Year Quarter Value
2019 1 1
2019 2 2
2019 3 3
我们可以gather
转换成'long'格式,然后用str_extract
或parse_number
提取组件
library(dplyr)
library(tidyr)
library(stringr)
gather(d) %>%
transmute(Year = readr::parse_number(key),
Quarter = as.numeric(str_extract(key, "(?<=q)\d+$")), value)
# Year Quarter value
#1 2019 1 1
#2 2019 2 2
#3 2019 3 3
使用 tidyr
的新 pivot_longer
函数的一种快速方法,它允许您一步调整数据和拆分列。查看列名称:
names(d)
#> [1] "X2019q1" "X2019q2" "X2019q3"
您会看到它们以 X
开头以使名称有效,并且年份和季度由 "q"
分隔。使用它作为 pivot_longer
中的分隔符来拆分年份和季度,然后从年份中删除非数字。或者,您可以使用 dplyr::mutate
将列转换为数字。
library(tidyr)
d %>%
pivot_longer(everything(), names_to = c("Year", "Quarter"),
names_sep = "q", values_to = "Value") %>%
dplyr::mutate(Year = stringr::str_remove(Year, "\D"))
#> # A tibble: 3 x 3
#> Year Quarter Value
#> <chr> <chr> <dbl>
#> 1 2019 1 1
#> 2 2019 2 2
#> 3 2019 3 3
假设我们在 R 中有这样一个 data.frame:
d = data.frame('2019q1' = 1, '2019q2' =2, '2019q3' = 3)
看起来像这样:
X2019q1 X2019q2 X2019q3
1 1 2 3
如何将其转换为如下所示:
Year Quarter Value
2019 1 1
2019 2 2
2019 3 3
我们可以gather
转换成'long'格式,然后用str_extract
或parse_number
library(dplyr)
library(tidyr)
library(stringr)
gather(d) %>%
transmute(Year = readr::parse_number(key),
Quarter = as.numeric(str_extract(key, "(?<=q)\d+$")), value)
# Year Quarter value
#1 2019 1 1
#2 2019 2 2
#3 2019 3 3
使用 tidyr
的新 pivot_longer
函数的一种快速方法,它允许您一步调整数据和拆分列。查看列名称:
names(d)
#> [1] "X2019q1" "X2019q2" "X2019q3"
您会看到它们以 X
开头以使名称有效,并且年份和季度由 "q"
分隔。使用它作为 pivot_longer
中的分隔符来拆分年份和季度,然后从年份中删除非数字。或者,您可以使用 dplyr::mutate
将列转换为数字。
library(tidyr)
d %>%
pivot_longer(everything(), names_to = c("Year", "Quarter"),
names_sep = "q", values_to = "Value") %>%
dplyr::mutate(Year = stringr::str_remove(Year, "\D"))
#> # A tibble: 3 x 3
#> Year Quarter Value
#> <chr> <chr> <dbl>
#> 1 2019 1 1
#> 2 2019 2 2
#> 3 2019 3 3