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

时间:2015-01-04 18:22:04

标签: r

我有以下数据框:

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

3 个答案:

答案 0 :(得分:4)

我认为惯用的方法只是计算一年中实际的一周(如果您的周数不是从一年的第一周开始)。

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

另一个基本R解决方案是使用as.POSIXlt类并使用其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)]

答案 1 :(得分:3)

您可以通过转换&#34;周&#34;来使用base R。列到factor并将级别指定为&#34;周&#34;的unique值。将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&#34;周&#34;列的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) 39;周&#39;并将其分配给新列seq_value

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

答案 2 :(得分:2)

dplyr解决方案:

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