我有以下数据框:
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
答案 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.table
(setDT
),然后获取分组变量&#的索引值(.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))