如何计算和标记 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.table
(setDT
),然后得到分组变量的索引值(.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))
我有以下数据框:
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.table
(setDT
),然后得到分组变量的索引值(.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))