使用重新启动序列基于另外两列对列进行排序

时间:2016-09-30 17:26:44

标签: r dataframe dplyr sequence

我正在处理类似于下面我想要计算的数据框或基于名称和年份的ID,但是当名称更改时重新启动。我查看了很多帖子(123),但大多数帖子都需要非重新启动的标识符/计数器。

我认为group_by和seq_along可行,但seq_along只接受一个变量,所以这不起作用

df1 <- df %>% 
    group_by(name, year) %>%
    arrange(year) %>%
    mutate(
        exp = seq_along(c(name, year)))

我还尝试使用.GRP等各种data.table序列,如下所示无效

df1 <- data.table(df, key="name,year")
df1 <- df1[, Year_id :=.GRP, by=key(df1)]

这是一个示例数据框。

df <- data.frame(
  name = rep(c("A","B"), each=5), 
  year=rep(2000:2001, times=5), 
  stringsAsFactors=FALSE)

期望的输出:

       name year     Year_id
1        A 2000         1
2        A 2000         1
3        A 2000         1
4        A 2001         2
5        A 2001         2
6        B 2000         1
7        B 2000         1
8        B 2000         1
9        B 2001         2
10       B 2001         2

2 个答案:

答案 0 :(得分:2)

怎么样?
Source: local data frame [10 x 4]
Groups: name [2]

     name  year Year_id    id
   <fctr> <int>   <int> <int>
1       A  2000       1     1
2       A  2000       1     1
3       A  2000       1     1
4       A  2001       2     2
5       A  2001       2     2
6       B  2000       1     1
7       B  2000       1     1
8       B  2000       1     1
9       B  2001       2     2
10      B  2001       2     2

给出了:

{{1}}

答案 1 :(得分:2)

1)dplyr 创建一个因子并提取其级别:

library(dplyr)
df %>% 
   arrange(name, year) %>% 
   group_by(name) %>%
   mutate(Year_id = as.numeric(factor(year))) %>%
   ungroup()

,并提供:

# A tibble: 10 x 3
    name  year Year_id
   <chr> <int>   <dbl>
1      A  2000       1
2      A  2000       1
3      A  2000       1
4      A  2001       2
5      A  2001       2
6      B  2000       1
7      B  2000       1
8      B  2001       2
9      B  2001       2
10     B  2001       2

1a)根据@ nicola的评论,mutate可以替换为mutate(Year_id = match(year, unique(year)))

2)没有包没有包可以写:

o <- with(df, order(name, year))
transform(df[o, ], Year_id = ave(year, name, FUN = function(x) as.numeric(factor(x))))

或使用match