R:为给定列的每个唯一值创建一个顺序计数器

时间:2018-01-18 14:27:37

标签: r

假设我有以下数据框:

personid date measurement
1         x     23
1         x     32
2         y     21
3         x     23
3         z     23
3         y     23

我想通过测量列对此数据框进行排序,然后创建一个新列,该列是排序测量列中的序列,如下所示:

personid date measurement id
1         x     23         2
1         x     32         3
2         y     21         1
3         x     23         2
3         z     23         2
3         y     23         2

我的第一直觉是做一些事情:

unique_measurements <- data.frame(unique(sort(df$measurement)))
unique_dates$counter <- 1:nrow(unique_dates)

现在我基本上有一个数据框,表示从给定测量到正确计数器的映射。我认识到这是做错的方法,但是(1)我如何实际使用这种映射来实现我的目标; (2)这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

这是一种更简单的方法:

df$id <- match(df$measurement, sort(unique(df$measurement)))
#   personid date measurement id
# 1        1    x          23  2
# 2        1    x          32  3
# 3        2    y          21  1
# 4        3    x          23  2
# 5        3    z          23  2
# 6        3    y          23  2

答案 1 :(得分:2)

使用factor作为中间人:

df$id = as.integer(factor(df$measurement))

如果您想使用您的方法,只需使用merge(尽管它可能会破坏行顺序,但请使用dplyr::left_joindata.table::merge来保留原始行中的行顺序)。

unique_measurements <- data.frame(measurement = sort(unique(df$measurement)))
unique_dates$id <- 1:nrow(unique_dates)
merge(df, unique_dates)