按组添加id,在R中重置为1

时间:2016-05-03 15:55:58

标签: r

我确定这必须是一个骗局,但我无法让它发挥作用。我想在数据框中添加ID col,对于一列中的每个唯一值,它会重置为1。描述的最佳方式是通过示例:

gr1 <- c("A","A","A","B","B","B")
gr2 <- c(1,1,2,3,4,4)

df <- data.frame(gr1, gr2)

期望的输出:

id <- c(1,1,2,1,2,2)
df <- cbind(df, id)

id在gr1的每个子集中标记gr2的唯一值。当gr1从A更改为B时,id重置为1.我已经读过这个(Assign an ID based on two columns R)但这不是我想要的。我不想添加排名功能(我认为),因为我希望我的关系在gr1中具有相同的ID,例如。

df2 <- df %>% group_by(gr1) %>% mutate(id=rank(gr2, ties.method="max")) 

把头靠在墙上。任何指针都会有很大的帮助。

3 个答案:

答案 0 :(得分:4)

尝试使用ave执行分组,factor从1重新分配顺序级别。请注意ave会自动将因子转换为数字,因为gr2是数字的,它会使结果一致。没有包使用。

df2 <- transform(df, gr2 = ave(gr2, gr1, FUN = factor))

,并提供:

> df2
  gr1 gr2
1   A   1
2   A   1
3   A   2
4   B   1
5   B   2
6   B   2

它返回一个包含因子和数字列的数据框:

> str(df2)
'data.frame':   6 obs. of  2 variables:
 $ gr1: Factor w/ 2 levels "A","B": 1 1 1 2 2 2
 $ gr2: num  1 1 2 1 2 2

答案 1 :(得分:4)

我们可以使用?rleid包中的data.table

library(data.table)
setDT(df)[, id := rleid(gr2), by = gr1]
> df
   gr1 gr2 id
1:   A   1  1
2:   A   1  1
3:   A   2  2
4:   B   3  1
5:   B   4  2
6:   B   4  2

答案 2 :(得分:3)

这是dplyr解决方案

df %>%
  group_by(gr1) %>%
  mutate(id=as.numeric(factor(gr2)))