我知道如何在 R 中复制列,但想知道是否有更优雅的方法来完成我正在执行的特定任务。
我有多个数据集。有些按年份显示值,有些按季度年显示值。由于我需要按 QuarterYear 对所有数据集进行计算,因此我需要更改按 Year 具有值的数据集,以便仅按 QuarterYear 重复该值。
我的 df 看起来如何:
Item Year2020 Year2021
A 1 4
B 2 5
C 3 6
我想要实现的目标
Item 1Q20 2Q20 3Q20 4Q20 1Q21 2Q21 3Q21 4Q21
A 1 1 1 1 4 4 4 4
B 2 2 2 2 5 5 5 5
C 3 3 3 3 6 6 6 6
我如何实现它:
#recreate df
df <- data.frame(Item = c("A", "B", "C"),
Year2020 = c(1, 2, 3),
Year2021 = c(4, 5, 6))
#replicate Year column 3 times and change names
df <- df %>%
cbind(replicate(3, df$`Year2020`)) %>%
rename(`1Q20` = `Year2020`,
`2Q20` = `1`,
`3Q20` = `2`,
`4Q20` = `3`) %>%
cbind(replicate(3, df$`Year2021`)) %>%
rename(`1Q21` = `Year2021`,
`2Q21` = `1`,
`3Q21` = `2`,
`4Q21` = `3`)
#rearrange col
df <- df[,c(1:2,4:6,3,7:9)]
幸运的是,我只有两年的专栏,但我必须对大量数据集进行操作,并想知道是否有更简洁的方法。
最佳答案
不知道什么对你来说是优雅的,我喜欢 pivot_*
工作流程:
library(tidyverse)
df %>%
pivot_longer(-Item) %>%
slice(rep(1:n(), each = 4L)) %>%
group_by(Item, name) %>%
mutate(name = paste0(1:n(), "Q", str_extract(name, "[0-9]{2}$"))) %>%
pivot_wider()
# # A tibble: 3 × 9
# # Groups: Item [3]
# Item `1Q20` `2Q20` `3Q20` `4Q20` `1Q21` `2Q21` `3Q21` `4Q21`
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A 1 1 1 1 4 4 4 4
# 2 B 2 2 2 2 5 5 5 5
# 3 C 3 3 3 3 6 6 6 6
关于r - 将 Year 列复制到 R 中的 QuarterYear,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74698903/