使用 R dplyr mutate 使用预先声明的级别创建因子列

问题描述 投票:0回答:1

我编写了 R 代码来生成定期报告,该报告需要对周数进行重新排序,以便我可以按最近 10 周进行过滤和排序。为了防止错误并最大程度地减少硬编码值,我更喜欢在脚本顶部声明本周顺序,以获取所使用的其他几个脚本。因此,我想定义一个有序因子列表,然后使用它来对周数列进行排序。 RepEx 如下,但通常我会重新排序所有 52 周,以便最近的 10 周周期是最后/最大的,例如

new_levels <- factor(1:52, levels = c(29:52, 1:28), ordered=TRUE)

旁注:欢迎就如何更好地处理最近(不一定是最长)的 10 周期间提出任何建议。我过去的挣扎是由于临近年底的延期(51、52、1、2、3...)。

示例:

new_levels <- factor(1:10, levels = c(8:10, 1:7), ordered=TRUE)

data <- tibble(Week = 1:10, ID = c("A","A","B","B","C","A","D","B","D","A"))

data <- data %>% mutate(Week2 = factor(Week, levels = new_levels, ordered = TRUE)) %>% arrange(Week2)

有序因子(new_levels)似乎是正确的,但排列()和str()的行为表明我想要的排序没有发生:

> new_levels
 [1] 1  2  3  4  5  6  7  8  9  10
Levels: 8 < 9 < 10 < 1 < 2 < 3 < 4 < 5 < 6 < 7
> data
# A tibble: 10 × 3
    Week ID    Week2
   <int> <chr> <ord>
 1     1 A     1    
 2     2 A     2    
 3     3 B     3    
 4     4 B     4    
 5     5 C     5    
 6     6 A     6    
 7     7 D     7    
 8     8 B     8    
 9     9 D     9    
10    10 A     10   
> str(data)
tibble [10 × 3] (S3: tbl_df/tbl/data.frame)
 $ Week : int [1:10] 1 2 3 4 5 6 7 8 9 10
 $ ID   : chr [1:10] "A" "A" "B" "B" ...
 $ Week2: Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 2 3 4 5 6 7 8 9 10

谢谢!

r dplyr factors mutate
1个回答
0
投票

levels 参数的顺序必须正确。另请注意,它通过

factor
函数转换为字符向量。您可以按如下方式简化代码:

new_levels <- c(8:10, 1:7)
data <- tibble(Week = 1:10, ID = c("A","A","B","B","C","A","D","B","D","A"))
data <- data %>%
  mutate(Week2 = factor(Week, levels = new_levels, ordered = TRUE)) %>%
  arrange(Week2)
© www.soinside.com 2019 - 2024. All rights reserved.