我有一个包含Year、Quarter、QY列和许多数值变量的数据集.

#example dataset
Year = c("2019", "2020", "2021",
         "2019", "2020", "2021",
         "2019", "2020", "2021",
         "2019", "2020", "2021")
Quarter = c("1Q", "1Q", "1Q",
            "2Q", "2Q", "2Q",
            "3Q", "3Q", "3Q",
            "4Q", "4Q", "4Q")
QY = c("1Q19", "1Q20", "1Q21",
                   "2Q19", "2Q20", "2Q21",
                   "3Q19", "3Q20", "3Q21",
                   "4Q19", "4Q20", "4Q21")
VAR1 = c(10, 20, 30,
         30, 20, 25,
         27, 10, 15,
         13, 34, 25)

df <- data.frame(Year, Quarter, QY, VAR1)

我需要把所有的字符列的因素.Year和Quarter列在转换时似乎有正确的级别,但QY列没有,所以我手动定义了它.

df$Year <- as.factor(df$Year)
df$Quarter <- as.factor(df$Quarter) 
df$QY <- as.factor(df$QY) 

#check the level, QY is incorrect
sapply(df, str)

#manually defined QY level
df$QY <- factor(df$QY,
                levels = c("1Q19", "2Q19", "3Q19", "4Q19",
                           "1Q20",  "2Q20", "3Q20", "4Q20",
                           "1Q21",  "2Q21", "3Q21", "4Q21"))

有没有一种更有效的方式让R可以自动识别这些QY的水平,而不需要我手动定义它?尤其是随着QY的增长,我需要从2019年开始定义它.

我认为没有必要将Year、Quarter、QY列更改为Time Variable,但请澄清我是否应该这样做.我的计算和数据可视化需求主要是按年更改或按QY更改.

推荐答案

对于示例数据,您可以按YearQuarter排列数据,然后使用forcats::fct_inorder设置QY的水平:

library(dplyr, warn=FALSE)
library(forcats)

df <- df |> 
  arrange(Year, Quarter) |> 
  mutate(QY = fct_inorder(QY))

levels(df$QY)
#>  [1] "1Q19" "2Q19" "3Q19" "4Q19" "1Q20" "2Q20" "3Q20" "4Q20" "1Q21" "2Q21"
#> [11] "3Q21" "4Q21"

或者使用基数R可以获得相同的结果,如下所示:

df <- df[order(df$Year, df$Quarter), ]
df$QY <- factor(df$QY, levels = unique(df$QY))

levels(df$QY)
#>  [1] "1Q19" "2Q19" "3Q19" "4Q19" "1Q20" "2Q20" "3Q20" "4Q20" "1Q21" "2Q21"
#> [11] "3Q21" "4Q21"

如果您不想避免对数据集重新排序,您可以这样做(感谢@RuiBarradas的建议):

ix <- order(df$Year, df$Quarter)
df$QY <- factor(df$QY, levels = unique(df$QY[ix]))

levels(df$QY)
#>  [1] "1Q19" "2Q19" "3Q19" "4Q19" "1Q20" "2Q20" "3Q20" "4Q20" "1Q21" "2Q21"
#> [11] "3Q21" "4Q21"

R相关问答推荐

单击 map 后,将坐标复制到剪贴板

在位置周围设定一个半径并识别该半径内的其他位置

gt()从gt为相同内容的单元格 colored颜色 不同?

更改默认系列1以更改名称

bslib::card_header中的shine::downloadButton,图标而不是文本

在另存为PNG之前隐藏htmlwidget绘图元素

使用较长的查询提取具有部分匹配的列表中的较短目标,

使用R中的正则表达式将一列分割为多列

迭代到DataFrame列并获得成对的值列表(col1->;col2、col2->;col3、col3->;col4等)的正确方法.

绘制采样开始和采样结束之间的事件

无法定义沿边轨迹的 colored颜色 渐变(与值无关)

当我们有多个反斜杠和/特殊字符时使用Gsubing

TreeNode打印 twig 并为其上色

有没有可能用shiny 的书签恢复手风琴面板?

如何为混合模型输出绘制不同的线型?

在同一单元格中创建包含整数和百分比的交叉表

如何使投篮在R中保持一致

从两个数据帧中,有没有办法计算R中一列的唯一值?

打印的.txt文件,将值显示为&Quot;Num&Quot;而不是值

使用nls()函数的非线性模型的半正态图