如何计算和标记 r 数据框中的唯一值

How to count and flag unique values in r dataframe

我有以下数据框:

data <- data.frame(week = c(rep("2014-01-06", 3), rep("2014-01-13", 3), rep("2014-01-20", 3)), values = c(1, 2, 3))

         week values
1 2014-01-06      1
2 2014-01-06      2
3 2014-01-06      3
4 2014-01-13      1
5 2014-01-13      2
6 2014-01-13      3
7 2014-01-20      1
8 2014-01-20      2
9 2014-01-20      3

我想在 data 中创建一个列来计算唯一 week 并为其分配一个顺序值,这样 df 就如下所示:

         week values seq_value
1 2014-01-06      1  1
2 2014-01-06      2  1
3 2014-01-06      3  1
4 2014-01-13      1  2
5 2014-01-13      2  2
6 2014-01-13      3  2
7 2014-01-20      1  3
8 2014-01-20      2  3
9 2014-01-20      3  3

您可以通过将 "week" 列转换为 factor 并将级别指定为 "week" 的 unique 值来使用 base R。将 factor 转换为 numeric 并获取级别的数字索引。

 data$seq_value <- with(data, as.numeric(factor(week,levels=unique(week) )))
 data$seq_value
 #[1] 1 1 1 2 2 2 3 3 3

match "week" 列到该列的 unique 值以获得 numeric 索引。

  with(data, match(week, unique(week)))
  #[1] 1 1 1 2 2 2 3 3 3

或者使用data.table,首先将data.frame转换为data.tablesetDT),然后得到分组变量的索引值(.GRP) 'week' 并将其分配给新列 seq_value

 library(data.table)
 setDT(data)[,seq_value:=.GRP, week][]

我想惯用的方法是根据提供的日期计算一年中的实际周数(以防您的周数不是从一年中的第一周开始)。

as.integer(format(as.Date(data$week), "%W"))
## [1] 1 1 1 2 2 2 3 3 3

另一个基础 R 解决方案是使用 as.POSIXlt class 并利用其 yday 属性

as.POSIXlt(data$week)$yday %/% 7 + 1
## [1] 1 1 1 2 2 2 3 3 3

如果您想要更短的语法,data.table 包(以及许多其他包 - 请参阅@Kshashaas 评论)提供了一个快速包装器

library(data.table)
week(data$week)
## [1] 1 1 1 2 2 2 3 3 3

这个包最好的地方是你可以通过引用创建列(类似于@akruns 的最后一个解决方案,但可能更有效,因为不需要 by 参数)

setDT(data)[, seq_value := week(week)]

一个dplyr解决方案:

library(dplyr)
data %>%
  mutate(seq_value = dense_rank(week))