我有一个看起来像这样的数据框(尽管天数和 uid 有更多的观察):
day uid
1 1 0zOs6
2 2 0zOs6
3 3 0zOs6
4 4 0zOs6
5 1 3jtMi
6 2 3jtMi
7 3 3jtMi
8 1 5mJSn
9 2 5mJSn
10 3 5mJSn
11 1 dD8ro
12 2 dD8ro
我想创建一个基于 uid 的新变量——基本上是一个新的 id,它从 1 开始,每次我们在 uid 行中有一个新 id 时增加 1,就像这样:
day uid newid
1 1 0zOs6 1
2 2 0zOs6 1
3 3 0zOs6 1
4 4 0zOs6 1
5 1 3jtMi 2
6 2 3jtMi 2
7 3 3jtMi 2
8 1 5mJSn 3
9 2 5mJSn 3
10 3 5mJSn 3
11 1 dD8ro 4
12 2 dD8ro 4
我怎样才能做到这一点?
答案 0 :(得分:3)
在 base R
中,我们可以使用 match
,它会非常快速和高效。不需要循环
df1$newid <- with(df1, match(uid, unique(uid)))
或者使用factor
并强制integer
df1$newid <- with(df1, as.integer(factor(uid, levels = unique(uid))))
答案 1 :(得分:2)
使用 data.table
的 .GRP
选项
> setDT(df)[, newid := .GRP, uid][]
day uid newid
1: 1 0zOs6 1
2: 2 0zOs6 1
3: 3 0zOs6 1
4: 4 0zOs6 1
5: 1 3jtMi 2
6: 2 3jtMi 2
7: 3 3jtMi 2
8: 1 5mJSn 3
9: 2 5mJSn 3
10: 3 5mJSn 3
11: 1 dD8ro 4
12: 2 dD8ro 4
或 rleid
> setDT(df)[, newid := rleid(uid)][]
day uid newid
1: 1 0zOs6 1
2: 2 0zOs6 1
3: 3 0zOs6 1
4: 4 0zOs6 1
5: 1 3jtMi 2
6: 2 3jtMi 2
7: 3 3jtMi 2
8: 1 5mJSn 3
9: 2 5mJSn 3
10: 3 5mJSn 3
11: 1 dD8ro 4
12: 2 dD8ro 4