我正在处理类似于下面我想要计算的数据框或基于名称和年份的ID,但是当名称更改时重新启动。我查看了很多帖子(1,2,3),但大多数帖子都需要非重新启动的标识符/计数器。
我认为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
答案 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
。