我确定这必须是一个骗局,但我无法让它发挥作用。我想在数据框中添加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"))
把头靠在墙上。任何指针都会有很大的帮助。
答案 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)))